diff --git a/go.mod b/go.mod index b789021..4986c17 100644 --- a/go.mod +++ b/go.mod @@ -1,28 +1,40 @@ module github.com/wI2L/fizz -go 1.12 +go 1.18 require ( github.com/Pallinder/go-randomdata v1.2.0 github.com/gin-contrib/cors v1.3.0 github.com/gin-gonic/gin v1.7.7 - github.com/go-playground/validator/v10 v10.9.0 // indirect github.com/gofrs/uuid v3.2.0+incompatible + github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9 + github.com/loopfz/gadgeto v0.9.0 + github.com/stretchr/testify v1.7.0 + golang.org/x/text v0.3.7 + gopkg.in/yaml.v2 v2.4.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.0 // indirect + github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-playground/validator/v10 v10.9.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/uuid v1.1.1 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9 github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 // indirect github.com/juju/testing v0.0.0-20190723135506-ce30eb24acd2 // indirect - github.com/loopfz/gadgeto v0.9.0 + github.com/leodido/go-urn v1.2.1 // indirect github.com/mattn/go-isatty v0.0.14 // indirect - github.com/stretchr/testify v1.7.0 - github.com/ugorji/go v1.2.6 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/ugorji/go/codec v1.2.6 // indirect golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect - golang.org/x/text v0.3.7 google.golang.org/protobuf v1.27.1 // indirect gopkg.in/go-playground/validator.v9 v9.30.0 // indirect gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect - gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index 79770f2..e9f30e0 100644 --- a/go.sum +++ b/go.sum @@ -92,7 +92,6 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/ugorji/go v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= github.com/ugorji/go/codec v0.0.0-20190128213124-ee1426cffec0/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -106,14 +105,12 @@ golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/openapi/generator.go b/openapi/generator.go index 99f6833..f3fd21b 100644 --- a/openapi/generator.go +++ b/openapi/generator.go @@ -28,6 +28,10 @@ var ( ginPathParamRe = regexp.MustCompile(`\/:([^\/]*)`) ) +var ( + typePathRe = regexp.MustCompile(`([\*\-a-zA-Z0-9\.\/_]+)(\[([\*\-a-zA-Z0-9\.\/_]+)\])?`) +) + // mediaTags maps media types to well-known // struct tags used for marshaling. var mediaTags = map[string]string{ @@ -1149,7 +1153,13 @@ func (g *Generator) typeName(t reflect.Type) string { return tn.TypeName() } } - name := t.String() // package.name. + rawName := t.String() // package.name. + submatch := typePathRe.FindStringSubmatch(rawName) + var name, typeParam = submatch[1], submatch[3] + if len(typeParam) > 0 { + lastIndex := strings.LastIndex(typeParam, "/") + typeParam = "-" + typeParam[lastIndex+1:] + } sp := strings.Index(name, ".") pkg := name[:sp] @@ -1161,9 +1171,9 @@ func (g *Generator) typeName(t reflect.Type) string { typ := name[sp+1:] if !g.fullNames { - return strings.Title(typ) + return strings.Title(typ) + typeParam } - return strings.Title(pkg) + strings.Title(typ) + return strings.Title(pkg) + strings.Title(typ) + typeParam } // updateSchemaValidation fills the fields of the schema diff --git a/openapi/generator_test.go b/openapi/generator_test.go index e63ac74..90f4fd7 100644 --- a/openapi/generator_test.go +++ b/openapi/generator_test.go @@ -74,6 +74,8 @@ type ( V struct { L int } + Foo[T any] struct { + } ) func (*X) TypeName() string { return "XXX" } @@ -601,6 +603,9 @@ func TestTypeName(t *testing.T) { // Unnamed type. assert.Equal(t, "", g.typeName(rt(struct{}{}))) + + // generic type + assert.Equal(t, "Foo-openapi.X", g.typeName(rt(Foo[X]{}))) } // TestSetInfo tests that the informations