diff options
Diffstat (limited to 'crates/shirabe-external-packages/src/symfony/console')
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) { |
