| 7527 | using ParserBase::parse; |
| 7528 | |
| 7529 | auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { |
| 7530 | auto validationResult = validate(); |
| 7531 | if( !validationResult ) |
| 7532 | return InternalParseResult( validationResult ); |
| 7533 | |
| 7534 | auto remainingTokens = tokens; |
| 7535 | if( remainingTokens && remainingTokens->type == TokenType::Option ) { |
| 7536 | auto const &token = *remainingTokens; |
| 7537 | if( isMatch(token.token ) ) { |
| 7538 | if( m_ref->isFlag() ) { |
| 7539 | auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() ); |
| 7540 | auto result = flagRef->setFlag( true ); |
| 7541 | if( !result ) |
| 7542 | return InternalParseResult( result ); |
| 7543 | if( result.value() == ParseResultType::ShortCircuitAll ) |
| 7544 | return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
| 7545 | } else { |
| 7546 | auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); |
| 7547 | ++remainingTokens; |
| 7548 | if( !remainingTokens ) |
| 7549 | return InternalParseResult::runtimeError( "Expected argument following " + token.token ); |
| 7550 | auto const &argToken = *remainingTokens; |
| 7551 | if( argToken.type != TokenType::Argument ) |
| 7552 | return InternalParseResult::runtimeError( "Expected argument following " + token.token ); |
| 7553 | auto result = valueRef->setValue( argToken.token ); |
| 7554 | if( !result ) |
| 7555 | return InternalParseResult( result ); |
| 7556 | if( result.value() == ParseResultType::ShortCircuitAll ) |
| 7557 | return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
| 7558 | } |
| 7559 | return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); |
| 7560 | } |
| 7561 | } |
| 7562 | return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); |
| 7563 | } |
| 7564 | |
| 7565 | auto validate() const -> Result override { |
| 7566 | if( m_optNames.empty() ) |