func (p *parser) readEnum(enum *ast.Enum) *parseError { if err := p.readToken("enum"); err != nil { return err } enum.Position = p.cur.astPosition() tok := p.next() if tok.err != nil { return tok.err } enum.Name = tok.value // TODO: validate if err := p.readToken("{"); err != nil { return err } // Parse enum values for !p.done { tok := p.next() if tok.err != nil { return tok.err } if tok.value == "}" { // end of enum // A semicolon after an enum is optional. if err := p.readToken(";"); err != nil { p.back() } return nil } // TODO: verify tok.value is a valid enum value name. ev := new(ast.EnumValue) enum.Values = append(enum.Values, ev) ev.Position = tok.astPosition() ev.Name = tok.value // TODO: validate ev.Up = enum if err := p.readToken("="); err != nil { return err } tok = p.next() if tok.err != nil { return tok.err } // TODO: check that tok.value is a valid enum value number. num, err := strconv.ParseInt(tok.value, 10, 32) if err != nil { return p.errorf("bad enum number %q: %v", tok.value, err) } ev.Number = int32(num) // TODO: validate if err := p.readToken(";"); err != nil { return err } } return p.errorf("unexpected EOF while parsing enum") }