(routes []*route, schema *openapi3.T)
| 390 | } |
| 391 | |
| 392 | func (g *Generator) buildRouterHelpers(routes []*route, schema *openapi3.T) error { |
| 393 | needsSecurity := hasSecuritySchema(schema) |
| 394 | |
| 395 | // sort the routes with query parameter to the top |
| 396 | sortableRoutes := sortableRouteList(routes) |
| 397 | sort.Stable(&sortableRoutes) |
| 398 | |
| 399 | fallbackName := "fallback" |
| 400 | fallback := jen.Id(fallbackName).Qual("net/http", "Handler") |
| 401 | // add all route handlers |
| 402 | for i := 0; i < len(sortableRoutes); i++ { |
| 403 | route := sortableRoutes[i] |
| 404 | var routeCallParams *jen.Statement |
| 405 | if needsSecurity { |
| 406 | routeCallParams = jen.List(jen.Id("service"), jen.Id("authBackend")) |
| 407 | } else { |
| 408 | routeCallParams = jen.List(jen.Id("service")) |
| 409 | } |
| 410 | primaryHandler := jen.Id(route.handler).Call(routeCallParams) |
| 411 | fallbackHandler := jen.Id(fallbackName) |
| 412 | ifElse := make([]jen.Code, 0) |
| 413 | for _, handler := range []jen.Code{primaryHandler, fallbackHandler} { |
| 414 | block := jen.Return(handler) |
| 415 | ifElse = append(ifElse, block) |
| 416 | } |
| 417 | |
| 418 | if len(ifElse) < 1 { |
| 419 | panic("if-else slice should contain two elements, one with the service interface being called and one passing the NotFoundHandler") |
| 420 | } |
| 421 | |
| 422 | implGuard := jen.If( |
| 423 | jen.List(jen.Id("service"), jen.Id("ok")).Op(":=").Id("service").Assert(jen.Id(generateSubServiceName(route.handler))), |
| 424 | jen.Id("ok")).Block(ifElse[0]).Else().Block(ifElse[1]) |
| 425 | |
| 426 | comment := jen.Commentf("%s helper that checks if the given service fulfills the interface. Returns fallback handler if not, otherwise returns matching handler.", generateHandlerTypeAssertionHelperName(route.handler)) |
| 427 | |
| 428 | var callParams *jen.Statement |
| 429 | if needsSecurity { |
| 430 | callParams = jen.List(jen.Id("service").Id("interface{}"), fallback, jen.Id("authBackend").Id(authBackendInterface)) |
| 431 | } else { |
| 432 | callParams = jen.List(jen.Id("service").Id("interface{}"), fallback) |
| 433 | } |
| 434 | helper := jen.Func().Id(generateHandlerTypeAssertionHelperName(route.handler)). |
| 435 | Params(callParams).Qual("net/http", "Handler").Block(implGuard).Line().Line() |
| 436 | |
| 437 | g.goSource.Line().Add(comment) |
| 438 | g.goSource.Add(helper) |
| 439 | } |
| 440 | |
| 441 | return nil |
| 442 | } |
| 443 | |
| 444 | func (g *Generator) buildRouterBodyWithFallback(routes []*route, schema *openapi3.T, fallback jen.Code) ([]jen.Code, error) { |
| 445 | needsSecurity := hasSecuritySchema(schema) |
nothing calls this directly
no test coverage detected