| 6001 | using ParserBase::parse; |
| 6002 | |
| 6003 | auto parse(std::string const &, TokenStream const &tokens) const -> InternalParseResult override { |
| 6004 | auto validationResult = validate(); |
| 6005 | if (!validationResult) |
| 6006 | return InternalParseResult(validationResult); |
| 6007 | |
| 6008 | auto remainingTokens = tokens; |
| 6009 | if (remainingTokens && remainingTokens->type == TokenType::Option) { |
| 6010 | auto const &token = *remainingTokens; |
| 6011 | if (isMatch(token.token)) { |
| 6012 | if (m_ref->isFlag()) { |
| 6013 | auto flagRef = static_cast<detail::BoundFlagRefBase *>(m_ref.get()); |
| 6014 | auto result = flagRef->setFlag(true); |
| 6015 | if (!result) |
| 6016 | return InternalParseResult(result); |
| 6017 | if (result.value() == ParseResultType::ShortCircuitAll) |
| 6018 | return InternalParseResult::ok(ParseState(result.value(), remainingTokens)); |
| 6019 | } else { |
| 6020 | auto valueRef = static_cast<detail::BoundValueRefBase *>(m_ref.get()); |
| 6021 | ++remainingTokens; |
| 6022 | if (!remainingTokens) |
| 6023 | return InternalParseResult::runtimeError("Expected argument following " + token.token); |
| 6024 | auto const &argToken = *remainingTokens; |
| 6025 | if (argToken.type != TokenType::Argument) |
| 6026 | return InternalParseResult::runtimeError("Expected argument following " + token.token); |
| 6027 | auto result = valueRef->setValue(argToken.token); |
| 6028 | if (!result) |
| 6029 | return InternalParseResult(result); |
| 6030 | if (result.value() == ParseResultType::ShortCircuitAll) |
| 6031 | return InternalParseResult::ok(ParseState(result.value(), remainingTokens)); |
| 6032 | } |
| 6033 | return InternalParseResult::ok(ParseState(ParseResultType::Matched, ++remainingTokens)); |
| 6034 | } |
| 6035 | } |
| 6036 | return InternalParseResult::ok(ParseState(ParseResultType::NoMatch, remainingTokens)); |
| 6037 | } |
| 6038 | |
| 6039 | auto validate() const -> Result override { |
| 6040 | if (m_optNames.empty()) |