From f02f2e884fbb48b8328a61b25bb5e83f435a41ed Mon Sep 17 00:00:00 2001 From: dylanhitt Date: Thu, 30 Jan 2025 14:11:44 -0500 Subject: [PATCH] feat: implement OpenAPIServable for echo adaptor --- examples/echo-compat/go.mod | 17 +++++++++++------ examples/echo-compat/go.sum | 24 +++++++++++------------- examples/echo-compat/main.go | 4 ++-- examples/gin-compat/main.go | 2 +- extra/fuegoecho/adaptor.go | 18 ++++++++++++++++++ extra/fuegoecho/go.mod | 2 ++ extra/fuegoecho/go.sum | 2 -- 7 files changed, 45 insertions(+), 24 deletions(-) diff --git a/examples/echo-compat/go.mod b/examples/echo-compat/go.mod index d2a53d1e..e2a5c29b 100644 --- a/examples/echo-compat/go.mod +++ b/examples/echo-compat/go.mod @@ -2,8 +2,12 @@ module github.com/go-fuego/fuego/examples/echo-compat go 1.23.3 +replace github.com/go-fuego/fuego => ../.. + +replace github.com/go-fuego/fuego/extra/fuegoecho => ../../extra/fuegoecho + require ( - github.com/go-fuego/fuego v0.17.0 + github.com/go-fuego/fuego v0.18.0-rc2 github.com/go-fuego/fuego/extra/fuegoecho v0.1.0 github.com/labstack/echo/v4 v4.13.3 github.com/stretchr/testify v1.10.0 @@ -11,7 +15,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.7 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/getkin/kin-openapi v0.128.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect @@ -19,6 +23,7 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.23.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/schema v1.4.1 // indirect github.com/invopop/yaml v0.3.1 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -32,10 +37,10 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.8.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect -) \ No newline at end of file +) diff --git a/examples/echo-compat/go.sum b/examples/echo-compat/go.sum index d05acd55..856a406d 100644 --- a/examples/echo-compat/go.sum +++ b/examples/echo-compat/go.sum @@ -1,13 +1,9 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= -github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= github.com/getkin/kin-openapi v0.128.0 h1:jqq3D9vC9pPq1dGcOCv7yOp1DaEe7c/T1vzcLbITSp4= github.com/getkin/kin-openapi v0.128.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= -github.com/go-fuego/fuego v0.17.0 h1:UBR0ib0Qq0XkGX8J3OTIwrlvHDGmysBVG3NHowA6UCQ= -github.com/go-fuego/fuego v0.17.0/go.mod h1:glaJIBAO3AaZx+c4jGYW4pHyhQkeMGuHx8qLchGAH8M= -github.com/go-fuego/fuego/extra/fuegoecho v0.1.0 h1:/GbuIobrgxIXvmw//g2UiNpMOw9iSDxSQLWSeGwoYrU= -github.com/go-fuego/fuego/extra/fuegoecho v0.1.0/go.mod h1:siNT1WGF5t1bq35qnRd4qkRbv2CUsJMR6TwwBQBtnIE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= @@ -24,6 +20,8 @@ github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= @@ -65,14 +63,14 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= @@ -81,4 +79,4 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= \ No newline at end of file +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/echo-compat/main.go b/examples/echo-compat/main.go index 5b14c53c..7c0025de 100644 --- a/examples/echo-compat/main.go +++ b/examples/echo-compat/main.go @@ -85,8 +85,8 @@ func server() (*echo.Echo, *fuego.OpenAPI) { // ) // Serve the OpenAPI spec - echoRouter.GET("/openapi.json", serveOpenApiJSONDescription(engine.OpenAPI)) - echoRouter.GET("/swagger", DefaultOpenAPIHandler("/openapi.json")) + + engine.RegisterOpenAPIRoutes(&fuegoecho.OpenAPIHandler{Echo: echoRouter}) return echoRouter, engine.OpenAPI } diff --git a/examples/gin-compat/main.go b/examples/gin-compat/main.go index 29200fb9..bfbc7d2e 100644 --- a/examples/gin-compat/main.go +++ b/examples/gin-compat/main.go @@ -80,7 +80,7 @@ func server() (*gin.Engine, *fuego.OpenAPI) { option.Tags("Fuego"), ) - engine.RegisterOpenAPIRoutes(&fuegogin.OpenAPIHandler{ginRouter}) + engine.RegisterOpenAPIRoutes(&fuegogin.OpenAPIHandler{GinEngine: ginRouter}) // Serve the OpenAPI spec return ginRouter, engine.OpenAPI diff --git a/extra/fuegoecho/adaptor.go b/extra/fuegoecho/adaptor.go index 26acd9a0..7f109c0b 100644 --- a/extra/fuegoecho/adaptor.go +++ b/extra/fuegoecho/adaptor.go @@ -9,6 +9,24 @@ import ( "github.com/go-fuego/fuego/internal" ) +type OpenAPIHandler struct { + Echo *echo.Echo +} + +func (o *OpenAPIHandler) SpecHandler(e *fuego.Engine) { + Get(e, o.Echo, e.OpenAPIConfig.SpecURL, e.SpecHandler(), fuego.OptionHide()) +} + +func (o *OpenAPIHandler) UIHandler(e *fuego.Engine) { + GetEcho( + e, + o.Echo, + e.OpenAPIConfig.SwaggerURL+"/", + echo.WrapHandler(e.OpenAPIConfig.UIHandler(e.OpenAPIConfig.SpecURL)), + fuego.OptionHide(), + ) +} + type echoIRouter interface { Add(method, path string, handler echo.HandlerFunc, middleware ...echo.MiddlewareFunc) *echo.Route } diff --git a/extra/fuegoecho/go.mod b/extra/fuegoecho/go.mod index 2b113a59..19481e29 100644 --- a/extra/fuegoecho/go.mod +++ b/extra/fuegoecho/go.mod @@ -2,6 +2,8 @@ module github.com/go-fuego/fuego/extra/fuegoecho go 1.23.3 +replace github.com/go-fuego/fuego => ../.. + require ( github.com/go-fuego/fuego v0.18.0-rc2 github.com/labstack/echo/v4 v4.13.3 diff --git a/extra/fuegoecho/go.sum b/extra/fuegoecho/go.sum index 3b35a62f..1b48aac4 100644 --- a/extra/fuegoecho/go.sum +++ b/extra/fuegoecho/go.sum @@ -4,8 +4,6 @@ github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3G github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= github.com/getkin/kin-openapi v0.128.0 h1:jqq3D9vC9pPq1dGcOCv7yOp1DaEe7c/T1vzcLbITSp4= github.com/getkin/kin-openapi v0.128.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= -github.com/go-fuego/fuego v0.18.0-rc2 h1:Ewm8+r+/B9Lr2FKLK9rFR2fxHRdjMQ/AaGkfZgBzv4s= -github.com/go-fuego/fuego v0.18.0-rc2/go.mod h1:OY7FkKD5g154J3mCTpY6SXqBQYrcI2Rg9N0Owft4WmU= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=