diff options
Diffstat (limited to 'crates/shirabe-external-packages/src/symfony')
| -rw-r--r-- | crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs | 12 | ||||
| -rw-r--r-- | crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs | 22 |
2 files changed, 28 insertions, 6 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs b/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs index d076f8a3..a16575de 100644 --- a/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs +++ b/crates/shirabe-external-packages/src/symfony/console/completion/completion_input.rs @@ -57,7 +57,10 @@ impl CompletionInput { } pub fn bind(&mut self, definition: &InputDefinition) -> anyhow::Result<()> { - self.inner.bind(definition)?; + self.inner + .base_bind(definition, |argv, token, parse_options| { + Ok(CompletionInput::parse_token(argv, token, parse_options)) + })?; let relevant_token = self.get_relevant_token(); if "-" == &relevant_token[0..1] { @@ -203,8 +206,11 @@ impl CompletionInput { self.inner.get_first_argument() } - pub(crate) fn parse_token(&mut self, token: &str, parse_options: bool) -> bool { - match self.inner.parse_token(token, parse_options) { + /// PHP `CompletionInput::parseToken` (called back from `ArgvInput::base_bind`). Takes the + /// embedded ArgvInput instead of `&mut self` because the parse loop already holds the + /// exclusive borrow of it. + fn parse_token(inner: &mut ArgvInput, token: &str, parse_options: bool) -> bool { + match inner.parse_token(token, parse_options) { Ok(value) => return value, Err(_e) => { // suppress errors, completed input is almost never valid diff --git a/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs b/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs index bf1ea659..59828631 100644 --- a/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs +++ b/crates/shirabe-external-packages/src/symfony/console/input/argv_input.rs @@ -76,21 +76,37 @@ impl ArgvInput { } pub fn bind(&mut self, definition: &InputDefinition) -> anyhow::Result<()> { + self.base_bind(definition, ArgvInput::parse_token) + } + + /// Shared body of `bind` (PHP `Input::bind`). PHP's `$this->parse()` ends in + /// `$this->parseToken()`, which late-binds to `CompletionInput::parseToken`; `parseToken` + /// is protected and not part of any trait, so the concrete implementation is threaded in + /// as a callback taking the embedded ArgvInput. + pub(crate) fn base_bind( + &mut self, + definition: &InputDefinition, + parse_token: impl FnMut(&mut ArgvInput, &str, bool) -> anyhow::Result<bool>, + ) -> anyhow::Result<()> { self.inner.arguments = IndexMap::new(); self.inner.options = IndexMap::new(); self.inner.definition = definition.clone(); - self.parse()?; + self.base_parse(parse_token)?; Ok(()) } - fn parse(&mut self) -> anyhow::Result<()> { + /// Shared body of `parse`; see `base_bind` for why `parse_token` is a parameter. + fn base_parse( + &mut self, + mut parse_token: impl FnMut(&mut ArgvInput, &str, bool) -> anyhow::Result<bool>, + ) -> anyhow::Result<()> { let mut parse_options = true; self.parsed = self.tokens.clone(); while !self.parsed.is_empty() { let token = self.parsed.remove(0); - parse_options = self.parse_token(&token, parse_options)?; + parse_options = parse_token(self, &token, parse_options)?; } Ok(()) } |
