diff --git a/example/generate.go b/example/generate.go index 4d791ac..be25825 100644 --- a/example/generate.go +++ b/example/generate.go @@ -1,3 +1,3 @@ package example -//go:generate goctl api plugin -plugin goctl-swagger="swagger" -api test.api -dir . +//go:generate goctl api plugin -plugin goctl-swagger="swagger" -api user.api -dir . diff --git a/generate/parser.go b/generate/parser.go index 7908a12..4befb43 100644 --- a/generate/parser.go +++ b/generate/parser.go @@ -1,12 +1,18 @@ package generate import ( + "bytes" "fmt" "github.com/tal-tech/go-zero/tools/goctl/api/spec" "net/http" "reflect" "strconv" "strings" + "unsafe" +) + +var ( + strColon = []byte(":") ) func applyGenerate(p Plugin) (*swaggerObject, error) { @@ -37,12 +43,24 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge for _, group := range groups { for _, route := range group.Routes { - path := route.Path - if strings.Contains(path, "/:") { - - } parameters := swaggerParametersObject{} + if countParams(path) > 0 { + p := strings.Split(path, "/") + for i := range p { + part := p[i] + if strings.Contains(part, ":") { + key := strings.TrimPrefix(p[i], ":") + path = strings.Replace(path, fmt.Sprintf(":%s", key), fmt.Sprintf("{%s}", key), 1) + parameters = append(parameters, swaggerParameterObject{ + Name: key, + In: "path", + Required: true, + Type: "string", + }) + } + } + } reqRef := fmt.Sprintf("#/definitions/%s", route.RequestType.Name) if len(route.RequestType.Name) > 0 { @@ -63,6 +81,7 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge if !ok { pathItemObject = swaggerPathItemObject{} } + desc := "A successful response." respRef := fmt.Sprintf("#/definitions/%s", route.ResponseType.Name) if len(route.ResponseType.Name) < 1 { @@ -132,6 +151,9 @@ func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec. for _, member := range i2.Members { kv := keyVal{Value: schemaOfField(member)} kv.Key = member.Name + if tag, err := member.GetPropertyName(); err == nil { + kv.Key = tag + } if schema.Properties == nil { schema.Properties = &swaggerSchemaObjectProperties{} } @@ -151,7 +173,7 @@ func schemaOfField(member spec.Member) swaggerSchemaObject { var props *swaggerSchemaObjectProperties switch ft := kind; ft { - case reflect.Invalid: + case reflect.Invalid: //[]Struct 也有可能是 Struct // []Struct refTypeName := strings.Replace(member.Type, "[", "", 1) refTypeName = strings.Replace(refTypeName, "]", "", 1) @@ -168,13 +190,29 @@ func schemaOfField(member spec.Member) swaggerSchemaObject { } switch ft := kind; ft { - case reflect.Slice, reflect.Invalid: + case reflect.Slice: ret = swaggerSchemaObject{ schemaCore: schemaCore{ Type: "array", Items: (*swaggerItemsObject)(&core), }, } + case reflect.Invalid: + // 判断是否数组 + if strings.HasPrefix(member.Type, "[]") { + ret = swaggerSchemaObject{ + schemaCore: schemaCore{ + Type: "array", + Items: (*swaggerItemsObject)(&core), + }, + } + } else { + + ret = swaggerSchemaObject{ + schemaCore: core, + Properties: props, + } + } default: ret = swaggerSchemaObject{ schemaCore: core, @@ -202,3 +240,20 @@ func primitiveSchema(kind reflect.Kind, t string) (ftype, format string, ok bool return "", "", false } } + +// StringToBytes converts string to byte slice without a memory allocation. +func stringToBytes(s string) (b []byte) { + return *(*[]byte)(unsafe.Pointer( + &struct { + string + Cap int + }{s, len(s)}, + )) +} + +func countParams(path string) uint16 { + var n uint16 + s := stringToBytes(path) + n += uint16(bytes.Count(s, strColon)) + return n +} diff --git a/go.mod b/go.mod index 740f42c..4fbb854 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/zeromicro/goctl-swagger go 1.15 require ( + github.com/davecgh/go-spew v1.1.1 github.com/grpc-ecosystem/grpc-gateway v1.14.3 github.com/tal-tech/go-zero v1.1.1 github.com/urfave/cli/v2 v2.3.0 diff --git a/main.go b/main.go index b667483..7b1604b 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/urfave/cli/v2" "github.com/zeromicro/goctl-swagger/action" - "os" "runtime" ) @@ -22,6 +21,7 @@ var ( ) func main() { + app := cli.NewApp() app.Usage = "a plugin of goctl to generate swagger.json" app.Version = fmt.Sprintf("%s %s/%s", version, runtime.GOOS, runtime.GOARCH)