package parser import ( "errors" "fmt" "strings" "zero/core/stringx" "zero/tools/goctl/api/spec" "zero/tools/goctl/api/util" ) func (p *Parser) validate(api *spec.ApiSpec) (err error) { var builder strings.Builder for _, tp := range api.Types { if ok, name := p.validateDuplicateProperty(tp); !ok { fmt.Fprintf(&builder, `duplicate property "%s" of type "%s"`+"\n", name, tp.Name) } } if ok, info := p.validateDuplicateRouteHandler(api); !ok { fmt.Fprintf(&builder, info) } if len(builder.String()) > 0 { return errors.New(builder.String()) } return nil } func (p *Parser) validateDuplicateProperty(tp spec.Type) (bool, string) { var names []string for _, member := range tp.Members { if stringx.Contains(names, member.Name) { return false, member.Name } else { names = append(names, member.Name) } } return true, "" } func (p *Parser) validateDuplicateRouteHandler(api *spec.ApiSpec) (bool, string) { var names []string for _, r := range api.Service.Routes { handler, ok := util.GetAnnotationValue(r.Annotations, "server", "handler") if !ok { return false, fmt.Sprintf("missing handler annotation for %s", r.Path) } if stringx.Contains(names, handler) { return false, fmt.Sprintf(`duplicated handler for name "%s"`, handler) } else { names = append(names, handler) } } return true, "" }