MCPcopy Create free account
hub / github.com/pace/bricks / buildRouterHelpers

Method buildRouterHelpers

http/jsonapi/generator/generate_handler.go:392–442  ·  view source on GitHub ↗
(routes []*route, schema *openapi3.T)

Source from the content-addressed store, hash-verified

390}
391
392func (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
444func (g *Generator) buildRouterBodyWithFallback(routes []*route, schema *openapi3.T, fallback jen.Code) ([]jen.Code, error) {
445 needsSecurity := hasSecuritySchema(schema)

Callers

nothing calls this directly

Calls 5

hasSecuritySchemaFunction · 0.85
sortableRouteListTypeAlias · 0.85
generateSubServiceNameFunction · 0.85
AddMethod · 0.65

Tested by

no test coverage detected