diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-24 04:16:08 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-24 04:16:08 +0900 |
| commit | e87d37a294a4c754585309d391d793a2c9a1287e (patch) | |
| tree | cc9ebf30f30355be0545a02462162c534516ca8b /crates/shirabe-external-packages/src/symfony/console/descriptor | |
| parent | f1af14b1cc503ac20f56a79a96c7780d02bdfe75 (diff) | |
| download | php-shirabe-e87d37a294a4c754585309d391d793a2c9a1287e.tar.gz php-shirabe-e87d37a294a4c754585309d391d793a2c9a1287e.tar.zst php-shirabe-e87d37a294a4c754585309d391d793a2c9a1287e.zip | |
feat(console): implement application description for `list`
Replace the todo!() in TextDescriptor::describe_application with a real
option-only InputDefinition built via InputDefinition::from_options,
which shares InputOption behind Rc instead of reconstructing by value.
Drop the now-unused Command::clone_box and switch the descriptors to
borrow the shared commands directly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-external-packages/src/symfony/console/descriptor')
4 files changed, 17 insertions, 26 deletions
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()); } |
