diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-16 21:59:35 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-19 22:17:11 +0900 |
| commit | fd733a87364b877d5e66b4973bd61b5379ec4d61 (patch) | |
| tree | 64bd6c37ca1c33581a851eba22e4261bf5b62b49 /crates/shirabe-external-packages/src/symfony/console/command/help_command.rs | |
| parent | 7f3171b14a89762b2f0c71969d7243f2297af7c9 (diff) | |
| download | php-shirabe-fd733a87364b877d5e66b4973bd61b5379ec4d61.tar.gz php-shirabe-fd733a87364b877d5e66b4973bd61b5379ec4d61.tar.zst php-shirabe-fd733a87364b877d5e66b4973bd61b5379ec4d61.zip | |
feat(command): implement Symfony Command
Diffstat (limited to 'crates/shirabe-external-packages/src/symfony/console/command/help_command.rs')
| -rw-r--r-- | crates/shirabe-external-packages/src/symfony/console/command/help_command.rs | 257 |
1 files changed, 73 insertions, 184 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/command/help_command.rs b/crates/shirabe-external-packages/src/symfony/console/command/help_command.rs index fb2a8a2..321b640 100644 --- a/crates/shirabe-external-packages/src/symfony/console/command/help_command.rs +++ b/crates/shirabe-external-packages/src/symfony/console/command/help_command.rs @@ -1,6 +1,6 @@ //! ref: composer/vendor/symfony/console/Command/HelpCommand.php -use crate::symfony::console::command::command::{BaseCommand, Command, SetDefinitionArg}; +use crate::symfony::console::command::command::{Command, CommandData, SetDefinitionArg}; use crate::symfony::console::completion::completion_input::CompletionInput; use crate::symfony::console::completion::completion_suggestions::{ CompletionSuggestions, StringOrSuggestion, @@ -20,12 +20,12 @@ use std::rc::Rc; /// HelpCommand displays the help for a given command. #[derive(Debug)] pub struct HelpCommand { - inner: BaseCommand, + inner: CommandData, command: Option<Rc<RefCell<dyn Command>>>, } impl Deref for HelpCommand { - type Target = BaseCommand; + type Target = CommandData; fn deref(&self) -> &Self::Target { &self.inner @@ -39,79 +39,21 @@ impl DerefMut for HelpCommand { } impl HelpCommand { - fn configure(&mut self) -> anyhow::Result<()> { - self.inner.ignore_validation_errors(); - - self.inner - .set_name("help")? - .set_definition(SetDefinitionArg::Array(vec![ - DefinitionItem::InputArgument(InputArgument::new( - "command_name".to_string(), - Some(InputArgument::OPTIONAL), - "The command name".to_string(), - PhpMixed::from("help".to_string()), - )?), - DefinitionItem::InputOption(InputOption::new( - "format", - PhpMixed::Null, - Some(InputOption::VALUE_REQUIRED), - "The output format (txt, xml, json, or md)".to_string(), - PhpMixed::from("txt".to_string()), - )?), - DefinitionItem::InputOption(InputOption::new( - "raw", - PhpMixed::Null, - Some(InputOption::VALUE_NONE), - "To output raw command help".to_string(), - PhpMixed::Null, - )?), - ])) - .set_description("Display help for a command") - .set_help( - "The <info>%command.name%</info> command displays help for a given command:\n\ - \n\ - \x20\x20<info>%command.full_name% list</info>\n\ - \n\ - You can also output the help in other formats by using the <comment>--format</comment> option:\n\ - \n\ - \x20\x20<info>%command.full_name% --format=xml list</info>\n\ - \n\ - To display the list of available commands, please use the <info>list</info> command.", - ); - - Ok(()) + pub fn new() -> Self { + let mut command = HelpCommand { + inner: CommandData::new(None), + command: None, + }; + command + .configure() + .expect("HelpCommand::configure uses static, valid metadata"); + command } pub fn set_command(&mut self, command: Rc<RefCell<dyn Command>>) { self.command = Some(command); } - fn execute( - &mut self, - input: &mut dyn InputInterface, - output: &mut dyn OutputInterface, - ) -> anyhow::Result<i64> { - if self.command.is_none() { - let application = self.get_application().unwrap(); - let command_name = input.get_argument("command_name")?.to_string(); - self.command = Some(application.borrow_mut().find(&command_name)?); - } - - let helper = DescriptorHelper::new(); - // TODO: DescriptorHelper::describe2 takes the described object as Option<PhpMixed>, - // but PhpMixed cannot hold a Command. The Command/Application object mixing for - // describe needs a dedicated type (Phase C). - let object: Option<PhpMixed> = todo!(); - let mut options = indexmap::IndexMap::new(); - options.insert("format".to_string(), input.get_option("format")?); - options.insert("raw_text".to_string(), input.get_option("raw")?); - let _ = helper.describe2(output, object, options); - - self.command = None; - - Ok(0) - } - pub fn complete_impl(&self, input: &CompletionInput, suggestions: &mut CompletionSuggestions) { if input.must_suggest_argument_values_for("command_name") { let application = self.get_application().unwrap(); @@ -142,130 +84,77 @@ impl HelpCommand { } impl Command for HelpCommand { - fn configure(&mut self) { - let _ = HelpCommand::configure(self); - } - - fn run( - &mut self, - input: &mut dyn InputInterface, - output: &mut dyn OutputInterface, - ) -> anyhow::Result<i64> { - self.inner.run(input, output) - } - - fn complete(&self, input: &CompletionInput, suggestions: &mut CompletionSuggestions) { - self.complete_impl(input, suggestions); - } - - fn is_enabled(&self) -> bool { - self.inner.is_enabled() - } - - fn set_application( - &mut self, - application: Option<Rc<RefCell<dyn crate::symfony::console::application::Application>>>, - ) { - self.inner.set_application(application); - } - - fn get_application( - &self, - ) -> Option<Rc<RefCell<dyn crate::symfony::console::application::Application>>> { - self.inner.get_application() - } - - fn set_helper_set( - &mut self, - helper_set: Rc<RefCell<crate::symfony::console::helper::helper_set::HelperSet>>, - ) { - self.inner.set_helper_set(helper_set); - } - - fn get_helper_set( - &self, - ) -> Option<Rc<RefCell<crate::symfony::console::helper::helper_set::HelperSet>>> { - self.inner.get_helper_set() - } - - fn merge_application_definition(&mut self, merge_args: bool) { - self.inner.merge_application_definition(merge_args); - } - - fn get_definition(&self) -> &crate::symfony::console::input::input_definition::InputDefinition { - self.inner.get_definition() - } + fn configure(&mut self) -> anyhow::Result<()> { + self.inner.ignore_validation_errors(); - fn get_native_definition( - &self, - ) -> &crate::symfony::console::input::input_definition::InputDefinition { - self.inner.get_native_definition() - } + self.inner.set_name("help")?; + self.inner.set_definition(SetDefinitionArg::Array(vec![ + DefinitionItem::InputArgument(InputArgument::new( + "command_name".to_string(), + Some(InputArgument::OPTIONAL), + "The command name".to_string(), + PhpMixed::from("help".to_string()), + )?), + DefinitionItem::InputOption(InputOption::new( + "format", + PhpMixed::Null, + Some(InputOption::VALUE_REQUIRED), + "The output format (txt, xml, json, or md)".to_string(), + PhpMixed::from("txt".to_string()), + )?), + DefinitionItem::InputOption(InputOption::new( + "raw", + PhpMixed::Null, + Some(InputOption::VALUE_NONE), + "To output raw command help".to_string(), + PhpMixed::Null, + )?), + ])); + self.inner.set_description("Display help for a command"); + self.inner.set_help( + "The <info>%command.name%</info> command displays help for a given command:\n\ + \n\ + \x20\x20<info>%command.full_name% list</info>\n\ + \n\ + You can also output the help in other formats by using the <comment>--format</comment> option:\n\ + \n\ + \x20\x20<info>%command.full_name% --format=xml list</info>\n\ + \n\ + To display the list of available commands, please use the <info>list</info> command.", + ); - fn set_name(&mut self, name: &str) -> anyhow::Result<()> { - self.inner.set_name(name)?; Ok(()) } - fn get_name(&self) -> Option<String> { - self.inner.get_name() - } - - fn set_hidden(&mut self, hidden: bool) { - self.inner.set_hidden(hidden); - } - - fn is_hidden(&self) -> bool { - self.inner.is_hidden() - } - - fn set_description(&mut self, description: &str) { - self.inner.set_description(description); - } - - fn get_description(&self) -> String { - self.inner.get_description() - } - - fn set_help(&mut self, help: &str) { - self.inner.set_help(help); - } - - fn get_help(&self) -> String { - self.inner.get_help() - } - - fn get_processed_help(&self) -> String { - self.inner.get_processed_help() - } - - fn set_aliases(&mut self, aliases: Vec<String>) -> anyhow::Result<()> { - self.inner.set_aliases(aliases)?; - Ok(()) - } + fn execute( + &mut self, + input: Rc<RefCell<dyn InputInterface>>, + output: Rc<RefCell<dyn OutputInterface>>, + ) -> anyhow::Result<i64> { + if self.command.is_none() { + let application = self.get_application().unwrap(); + let command_name = input.borrow().get_argument("command_name")?.to_string(); + self.command = Some(application.borrow_mut().find(&command_name)?); + } - fn get_aliases(&self) -> Vec<String> { - self.inner.get_aliases() - } + let helper = DescriptorHelper::new(); + // TODO: DescriptorHelper::describe2 takes the described object as Option<PhpMixed>, + // but PhpMixed cannot hold a Command. The Command/Application object mixing for + // describe needs a dedicated type (Phase C). + let object: Option<PhpMixed> = todo!(); + let mut options = indexmap::IndexMap::new(); + options.insert("format".to_string(), input.borrow().get_option("format")?); + options.insert("raw_text".to_string(), input.borrow().get_option("raw")?); + let _ = helper.describe2(&mut *output.borrow_mut(), object, options); - fn get_synopsis(&mut self, short: bool) -> String { - self.inner.get_synopsis(short) - } + self.command = None; - fn get_usages(&self) -> Vec<String> { - self.inner.get_usages() + Ok(0) } - fn get_helper( - &self, - name: &str, - ) -> anyhow::Result< - Result<PhpMixed, crate::symfony::console::exception::logic_exception::LogicException>, - > { - self.inner.get_helper(name) + fn complete(&self, input: &CompletionInput, suggestions: &mut CompletionSuggestions) { + self.complete_impl(input, suggestions); } - fn ignore_validation_errors(&mut self) { - self.inner.ignore_validation_errors(); - } + crate::delegate_command_trait_impls_to_inner!(inner); } |
