infostate.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package parser
  2. import (
  3. "fmt"
  4. "strings"
  5. "zero/tools/goctl/api/spec"
  6. )
  7. const (
  8. titleTag = "title"
  9. descTag = "desc"
  10. versionTag = "version"
  11. authorTag = "author"
  12. emailTag = "email"
  13. )
  14. type infoState struct {
  15. *baseState
  16. innerState int
  17. }
  18. func newInfoState(st *baseState) state {
  19. return &infoState{
  20. baseState: st,
  21. innerState: startState,
  22. }
  23. }
  24. func (s *infoState) process(api *spec.ApiSpec) (state, error) {
  25. attrs, err := s.parseProperties()
  26. if err != nil {
  27. return nil, err
  28. }
  29. if err := s.writeInfo(api, attrs); err != nil {
  30. return nil, err
  31. }
  32. return newRootState(s.r, s.lineNumber), nil
  33. }
  34. func (s *infoState) writeInfo(api *spec.ApiSpec, attrs map[string]string) error {
  35. for k, v := range attrs {
  36. switch k {
  37. case titleTag:
  38. api.Info.Title = strings.TrimSpace(v)
  39. case descTag:
  40. api.Info.Desc = strings.TrimSpace(v)
  41. case versionTag:
  42. api.Info.Version = strings.TrimSpace(v)
  43. case authorTag:
  44. api.Info.Author = strings.TrimSpace(v)
  45. case emailTag:
  46. api.Info.Email = strings.TrimSpace(v)
  47. default:
  48. return fmt.Errorf("unknown directive %q in %q section", k, infoDirective)
  49. }
  50. }
  51. return nil
  52. }