From 1e44f5723e4c0e0903d00a61f254901e612fe5e1 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 12 Jun 2026 01:01:35 +0900 Subject: feat(symfony-console): port Symfony Console and make the workspace compile Co-Authored-By: Claude Opus 4.8 --- .../src/symfony/console/helper/helper_set.rs | 108 +++++++++++++++++++-- 1 file changed, 98 insertions(+), 10 deletions(-) (limited to 'crates/shirabe-external-packages/src/symfony/console/helper/helper_set.rs') diff --git a/crates/shirabe-external-packages/src/symfony/console/helper/helper_set.rs b/crates/shirabe-external-packages/src/symfony/console/helper/helper_set.rs index e38dbf3..a7ef820 100644 --- a/crates/shirabe-external-packages/src/symfony/console/helper/helper_set.rs +++ b/crates/shirabe-external-packages/src/symfony/console/helper/helper_set.rs @@ -1,27 +1,115 @@ -use crate::symfony::console::helper::HelperInterface; +use crate::symfony::console::command::command::Command; +use crate::symfony::console::exception::invalid_argument_exception::InvalidArgumentException; +use crate::symfony::console::helper::helper_interface::HelperInterface; use indexmap::IndexMap; use std::cell::RefCell; use std::rc::Rc; -#[derive(Debug)] +/// HelperSet represents a set of helpers to be used with a command. +/// +/// @implements \IteratorAggregate +#[derive(Debug, Default, Clone)] pub struct HelperSet { helpers: IndexMap>>, + command: Option>>, } impl HelperSet { - pub fn new(_helpers: Vec>>) -> Self { - todo!() + /// @param Helper[] $helpers An array of helper + pub fn new( + this: &Rc>, + helpers: IndexMap>>, + ) { + for (alias, helper) in helpers { + let alias = match alias { + HelperSetKey::Int(_) => None, + HelperSetKey::String(alias) => Some(alias), + }; + Self::set(this, helper, alias.as_deref()); + } } - pub fn get(&self, _name: &str) -> Rc> { - todo!() + pub fn set( + this: &Rc>, + helper: Rc>, + alias: Option<&str>, + ) { + let name = helper.borrow().get_name(); + this.borrow_mut().helpers.insert(name, helper.clone()); + if let Some(alias) = alias { + this.borrow_mut() + .helpers + .insert(alias.to_string(), helper.clone()); + } + + helper.borrow_mut().set_helper_set(Some(this.clone())); + } + + /// Returns true if the helper if defined. + pub fn has(&self, name: &str) -> bool { + self.helpers.contains_key(name) + } + + /// Gets a helper value. + /// + /// @throws InvalidArgumentException if the helper is not defined + pub fn get( + &self, + name: &str, + ) -> Result>, InvalidArgumentException> { + if !self.has(name) { + return Err(InvalidArgumentException( + shirabe_php_shim::InvalidArgumentException { + message: shirabe_php_shim::sprintf( + "The helper \"%s\" is not defined.", + &[shirabe_php_shim::PhpMixed::String(name.to_string())], + ), + code: 0, + }, + )); + } + + Ok(self.helpers[name].clone()) } - pub fn set(&mut self, _helper: Rc>, _alias: Option<&str>) { - todo!() + /// @deprecated since Symfony 5.4 + pub fn set_command(&mut self, command: Option>>) { + shirabe_php_shim::trigger_deprecation( + "symfony/console", + "5.4", + "Method \"%s()\" is deprecated.", + "HelperSet::setCommand", + ); + + self.command = command; + } + + /// Gets the command associated with this helper set. + /// + /// @deprecated since Symfony 5.4 + pub fn get_command(&self) -> Option>> { + shirabe_php_shim::trigger_deprecation( + "symfony/console", + "5.4", + "Method \"%s()\" is deprecated.", + "HelperSet::getCommand", + ); + + self.command.clone() } - pub fn has(&self, _name: &str) -> bool { - todo!() + /// @return \Traversable + pub fn get_iterator( + &self, + ) -> impl Iterator>)> { + self.helpers.iter() } } + +/// PHP array keys are either integers or strings; the HelperSet constructor +/// distinguishes them via `\is_int($alias)`. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum HelperSetKey { + Int(i64), + String(String), +} -- cgit v1.3.1