| 7308 | using ParserBase::parse; |
| 7309 | |
| 7310 | auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { |
| 7311 | auto validationResult = validate(); |
| 7312 | if( !validationResult ) |
| 7313 | return InternalParseResult( validationResult ); |
| 7314 | |
| 7315 | auto remainingTokens = tokens; |
| 7316 | if( remainingTokens && remainingTokens->type == TokenType::Option ) { |
| 7317 | auto const &token = *remainingTokens; |
| 7318 | if( isMatch(token.token ) ) { |
| 7319 | if( m_ref->isFlag() ) { |
| 7320 | auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() ); |
| 7321 | auto result = flagRef->setFlag( true ); |
| 7322 | if( !result ) |
| 7323 | return InternalParseResult( result ); |
| 7324 | if( result.value() == ParseResultType::ShortCircuitAll ) |
| 7325 | return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
| 7326 | } else { |
| 7327 | auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); |
| 7328 | ++remainingTokens; |
| 7329 | if( !remainingTokens ) |
| 7330 | return InternalParseResult::runtimeError( "Expected argument following " + token.token ); |
| 7331 | auto const &argToken = *remainingTokens; |
| 7332 | if( argToken.type != TokenType::Argument ) |
| 7333 | return InternalParseResult::runtimeError( "Expected argument following " + token.token ); |
| 7334 | auto result = valueRef->setValue( argToken.token ); |
| 7335 | if( !result ) |
| 7336 | return InternalParseResult( result ); |
| 7337 | if( result.value() == ParseResultType::ShortCircuitAll ) |
| 7338 | return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
| 7339 | } |
| 7340 | return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); |
| 7341 | } |
| 7342 | } |
| 7343 | return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); |
| 7344 | } |
| 7345 | |
| 7346 | auto validate() const -> Result override { |
| 7347 | if( m_optNames.empty() ) |