github.com/vcilabs/webrpc@v0.5.2-0.20201116131534-162e27b1b33b/schema/ridl/enum_parser.go (about)

     1  package ridl
     2  
     3  func parserStateEnumExplicitValue(en *EnumNode, dn *DefinitionNode) parserState {
     4  	return func(p *parser) parserState {
     5  		// [= <value>]
     6  		_, err := p.match(tokenWhitespace, tokenEqual, tokenWhitespace)
     7  
     8  		if err == nil {
     9  			explicitValue, err := p.expectLiteralValue()
    10  			if err != nil {
    11  				return p.stateError(err)
    12  			}
    13  			dn.rightNode = newTokenNode(explicitValue)
    14  		}
    15  
    16  		en.values = append(en.values, dn)
    17  
    18  		return parserStateEnumDefinition(en)
    19  	}
    20  }
    21  
    22  func parserStateEnumDefinition(et *EnumNode) parserState {
    23  	return func(p *parser) parserState {
    24  		tok := p.cursor()
    25  
    26  		switch tok.tt {
    27  
    28  		case tokenDash:
    29  			// - <name> [= <value>] [<# comment>][EOL]
    30  			matches, err := p.match(tokenDash, tokenWhitespace, tokenWord)
    31  
    32  			if err != nil {
    33  				return p.stateError(err)
    34  			}
    35  
    36  			return parserStateEnumExplicitValue(et, &DefinitionNode{
    37  				leftNode: newTokenNode(matches[2]),
    38  			})
    39  
    40  		case tokenNewLine, tokenWhitespace:
    41  			p.next()
    42  
    43  		case tokenHash:
    44  			p.continueUntilEOL()
    45  
    46  		default:
    47  			p.emit(et)
    48  			return parserDefaultState
    49  
    50  		}
    51  
    52  		return parserStateEnumDefinition(et)
    53  	}
    54  }
    55  
    56  func parserStateEnum(p *parser) parserState {
    57  	// enum <name>: <type>[<# comment>]
    58  	matches, err := p.match(tokenWord, tokenWhitespace, tokenWord, tokenColon, tokenWhitespace, tokenWord, tokenEOL)
    59  	if err != nil {
    60  		return p.stateError(err)
    61  	}
    62  
    63  	if matches[0].val != wordEnum {
    64  		return p.stateError(errUnexpectedToken)
    65  	}
    66  
    67  	return parserStateEnumDefinition(&EnumNode{
    68  		name:     newTokenNode(matches[2]),
    69  		enumType: newTokenNode(matches[5]),
    70  		values:   []*DefinitionNode{},
    71  	})
    72  }