aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/command/command.rs6
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs10
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs10
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs13
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs10
-rw-r--r--crates/shirabe-external-packages/src/symfony/console/input/input_definition.rs26
6 files changed, 42 insertions, 33 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/command/command.rs b/crates/shirabe-external-packages/src/symfony/console/command/command.rs
index 652463f..840f11a 100644
--- a/crates/shirabe-external-packages/src/symfony/console/command/command.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/command/command.rs
@@ -334,12 +334,6 @@ macro_rules! delegate_command_trait_impls_to_inner {
/// Object-safe so `dyn Command` works. All methods take `&self`; the command's mutable
/// state is interior-mutable (see [`CommandData`]).
pub trait Command: std::fmt::Debug + shirabe_php_shim::AsAny {
- fn clone_box(&self) -> Box<dyn Command> {
- todo!()
- }
-
- // --- behavior hooks (PHP-overridable; defaults match the PHP `Command` class) ---
-
/// Configures the current command.
fn configure(&self) -> anyhow::Result<()> {
Ok(())
diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs
index 6dd64f3..4f8e335 100644
--- a/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs
@@ -78,14 +78,10 @@ impl JsonDescriptor {
let mut commands: Vec<PhpMixed> = vec![];
let short = matches!(options.get("short"), Some(PhpMixed::Bool(true)));
- let command_list: Vec<_> = description
- .get_commands()
- .values()
- .map(|c| c.borrow().clone_box())
- .collect();
- for command in command_list {
+ for command in description.get_commands().values() {
+ let command = command.borrow();
commands.push(PhpMixed::Array(
- self.get_command_data(command.as_ref(), short)?
+ self.get_command_data(&*command, short)?
.into_iter()
.collect(),
));
diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs
index ef16fc0..26efd4c 100644
--- a/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs
@@ -280,15 +280,11 @@ impl MarkdownDescriptor {
);
}
- let command_list: Vec<_> = description
- .get_commands()
- .values()
- .map(|c| c.borrow().clone_box())
- .collect();
- for command in command_list {
+ for command in description.get_commands().values() {
+ let command = command.borrow();
self.write("\n\n", true);
// describeCommand returns null; the guarded write never runs.
- self.describe_command(command.as_ref(), options.clone())?;
+ self.describe_command(&*command, options.clone())?;
}
Ok(())
}
diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs
index b0c0090..afb7ca8 100644
--- a/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs
@@ -308,11 +308,14 @@ impl TextDescriptor {
self.write_text("<comment>Usage:</comment>\n", &options);
self.write_text(" command [options] [arguments]\n\n", &options);
- // PHP: new InputDefinition($application->getDefinition()->getOptions()).
- // `InputOption` is not Clone and lives behind `Rc`, so the option-only
- // definition cannot be reconstructed by value yet.
- let definition: InputDefinition =
- todo!("new InputDefinition($application->getDefinition()->getOptions())");
+ let app_definition = application.borrow_mut().get_definition();
+ let options_only: Vec<std::rc::Rc<InputOption>> = app_definition
+ .borrow()
+ .get_options()
+ .values()
+ .cloned()
+ .collect();
+ let definition = InputDefinition::from_options(options_only)?;
self.describe_input_definition(&definition, options.clone())?;
self.write_text("\n", &IndexMap::new());
diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs
index fc2b948..77fca93 100644
--- a/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs
@@ -120,13 +120,9 @@ impl XmlDescriptor {
commands_xml.set_attribute("namespace", namespace);
}
- let command_list: Vec<_> = description
- .get_commands()
- .values()
- .map(|c| c.borrow().clone_box())
- .collect();
- for command in command_list {
- let command_xml = self.get_command_document(command.as_ref(), short);
+ for command in description.get_commands().values() {
+ let command = command.borrow();
+ let command_xml = self.get_command_document(&*command, short);
self.append_document(&commands_xml, &command_xml.as_node());
}
diff --git a/crates/shirabe-external-packages/src/symfony/console/input/input_definition.rs b/crates/shirabe-external-packages/src/symfony/console/input/input_definition.rs
index 390f416..911e287 100644
--- a/crates/shirabe-external-packages/src/symfony/console/input/input_definition.rs
+++ b/crates/shirabe-external-packages/src/symfony/console/input/input_definition.rs
@@ -46,6 +46,26 @@ impl InputDefinition {
Ok(input_definition)
}
+ /// Builds an option-only definition that shares the given options by
+ /// reference, mirroring `new InputDefinition($definition->getOptions())`.
+ /// `InputOption` is not `Clone` and lives behind `Rc`, so the options are
+ /// reused rather than reconstructed by value.
+ pub fn from_options(options: Vec<Rc<InputOption>>) -> anyhow::Result<Self> {
+ let mut input_definition = InputDefinition {
+ arguments: IndexMap::new(),
+ required_count: 0,
+ last_array_argument: None,
+ last_optional_argument: None,
+ options: IndexMap::new(),
+ negations: IndexMap::new(),
+ shortcuts: IndexMap::new(),
+ };
+ for option in options {
+ input_definition.add_option_rc(option)?;
+ }
+ Ok(input_definition)
+ }
+
/// Sets the definition of the input.
pub fn set_definition(&mut self, definition: Vec<DefinitionItem>) -> anyhow::Result<()> {
let mut arguments = vec![];
@@ -230,8 +250,12 @@ impl InputDefinition {
}
pub fn add_option(&mut self, option: InputOption) -> anyhow::Result<()> {
- let option = Rc::new(option);
+ self.add_option_rc(Rc::new(option))
+ }
+ /// Adds an option that is already shared behind `Rc`, mirroring PHP passing
+ /// `InputOption` objects by reference.
+ pub fn add_option_rc(&mut self, option: Rc<InputOption>) -> anyhow::Result<()> {
if let Some(existing) = self.options.get(option.get_name())
&& !option.equals(existing)
{