parser.go 1009 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package parser
  2. import (
  3. "bufio"
  4. "bytes"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "zero/tools/goctl/api/spec"
  9. )
  10. type Parser struct {
  11. r *bufio.Reader
  12. st string
  13. }
  14. func NewParser(filename string) (*Parser, error) {
  15. api, err := ioutil.ReadFile(filename)
  16. if err != nil {
  17. return nil, err
  18. }
  19. info, body, service, err := MatchStruct(string(api))
  20. if err != nil {
  21. return nil, err
  22. }
  23. var buffer = new(bytes.Buffer)
  24. buffer.WriteString(info)
  25. buffer.WriteString(service)
  26. return &Parser{
  27. r: bufio.NewReader(buffer),
  28. st: body,
  29. }, nil
  30. }
  31. func (p *Parser) Parse() (api *spec.ApiSpec, err error) {
  32. api = new(spec.ApiSpec)
  33. types, err := parseStructAst(p.st)
  34. if err != nil {
  35. return nil, err
  36. }
  37. api.Types = types
  38. var lineNumber = 1
  39. st := newRootState(p.r, &lineNumber)
  40. for {
  41. st, err = st.process(api)
  42. if err == io.EOF {
  43. return api, p.validate(api)
  44. }
  45. if err != nil {
  46. return nil, fmt.Errorf("near line: %d, %s", lineNumber, err.Error())
  47. }
  48. if st == nil {
  49. return api, p.validate(api)
  50. }
  51. }
  52. }