...

Source file src/github.com/emicklei/proto/reserved.go

Documentation: github.com/emicklei/proto

     1  // Copyright (c) 2017 Ernest Micklei
     2  //
     3  // MIT License
     4  //
     5  // Permission is hereby granted, free of charge, to any person obtaining
     6  // a copy of this software and associated documentation files (the
     7  // "Software"), to deal in the Software without restriction, including
     8  // without limitation the rights to use, copy, modify, merge, publish,
     9  // distribute, sublicense, and/or sell copies of the Software, and to
    10  // permit persons to whom the Software is furnished to do so, subject to
    11  // the following conditions:
    12  //
    13  // The above copyright notice and this permission notice shall be
    14  // included in all copies or substantial portions of the Software.
    15  //
    16  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    17  // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    18  // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    19  // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    20  // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    21  // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    22  // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    23  
    24  package proto
    25  
    26  import "text/scanner"
    27  
    28  // Reserved statements declare a range of field numbers or field names that cannot be used in a message.
    29  type Reserved struct {
    30  	Position      scanner.Position
    31  	Comment       *Comment
    32  	Ranges        []Range
    33  	FieldNames    []string
    34  	InlineComment *Comment
    35  	Parent        Visitee
    36  }
    37  
    38  // inlineComment is part of commentInliner.
    39  func (r *Reserved) inlineComment(c *Comment) {
    40  	r.InlineComment = c
    41  }
    42  
    43  // Accept dispatches the call to the visitor.
    44  func (r *Reserved) Accept(v Visitor) {
    45  	v.VisitReserved(r)
    46  }
    47  
    48  func (r *Reserved) parse(p *Parser) error {
    49  	for {
    50  		pos, tok, lit := p.next()
    51  		if len(lit) == 0 {
    52  			return p.unexpected(lit, "reserved string or integer", r)
    53  		}
    54  		// first char that determined tok
    55  		ch := []rune(lit)[0]
    56  		if isDigit(ch) || ch == '-' {
    57  			// use unread here because it could be start of ranges
    58  			p.nextPut(pos, tok, lit)
    59  			list, err := parseRanges(p, r)
    60  			if err != nil {
    61  				return err
    62  			}
    63  			r.Ranges = list
    64  			continue
    65  		}
    66  		if isString(lit) {
    67  			s, _ := unQuote(lit)
    68  			r.FieldNames = append(r.FieldNames, s)
    69  			continue
    70  		}
    71  		if tSEMICOLON == tok {
    72  			p.nextPut(pos, tok, lit)
    73  			break
    74  		}
    75  	}
    76  	return nil
    77  }
    78  
    79  func (r *Reserved) parent(v Visitee) { r.Parent = v }
    80  

View as plain text