| 9102 | using ParserBase::parse; |
| 9103 | |
| 9104 | auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { |
| 9105 | auto validationResult = validate(); |
| 9106 | if( !validationResult ) |
| 9107 | return InternalParseResult( validationResult ); |
| 9108 | |
| 9109 | auto remainingTokens = tokens; |
| 9110 | if( remainingTokens && remainingTokens->type == TokenType::Option ) { |
| 9111 | auto const &token = *remainingTokens; |
| 9112 | if( isMatch(token.token ) ) { |
| 9113 | if( m_ref->isFlag() ) { |
| 9114 | auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() ); |
| 9115 | auto result = flagRef->setFlag( true ); |
| 9116 | if( !result ) |
| 9117 | return InternalParseResult( result ); |
| 9118 | if( result.value() == ParseResultType::ShortCircuitAll ) |
| 9119 | return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
| 9120 | } else { |
| 9121 | auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); |
| 9122 | ++remainingTokens; |
| 9123 | if( !remainingTokens ) |
| 9124 | return InternalParseResult::runtimeError( "Expected argument following " + token.token ); |
| 9125 | auto const &argToken = *remainingTokens; |
| 9126 | if( argToken.type != TokenType::Argument ) |
| 9127 | return InternalParseResult::runtimeError( "Expected argument following " + token.token ); |
| 9128 | auto result = valueRef->setValue( argToken.token ); |
| 9129 | if( !result ) |
| 9130 | return InternalParseResult( result ); |
| 9131 | if( result.value() == ParseResultType::ShortCircuitAll ) |
| 9132 | return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
| 9133 | } |
| 9134 | return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); |
| 9135 | } |
| 9136 | } |
| 9137 | return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); |
| 9138 | } |
| 9139 | |
| 9140 | auto validate() const -> Result override { |
| 9141 | if( m_optNames.empty() ) |