mirror of
https://github.com/hatchet-dev/hatchet.git
synced 2026-01-05 16:19:43 -06:00
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package serverutils
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
// ParamContext represents a subset of echo.Context to make testing easier
|
|
type ParamContext interface {
|
|
// Get retrieves data from the context.
|
|
Get(key string) interface{}
|
|
|
|
// Set saves data in the context.
|
|
Set(key string, val interface{})
|
|
|
|
// Param returns path parameter by name.
|
|
Param(name string) string
|
|
|
|
// ParamNames returns path parameter names.
|
|
ParamNames() []string
|
|
|
|
// ParamValues returns path parameter values.
|
|
ParamValues() []string
|
|
}
|
|
|
|
// RequestContext wraps echo.Context but Get and Set set values on the request context, rather than the
|
|
// echo context. This is necessary when we use the oapi-gen StrictServerInterface, since the implemented
|
|
// methods are passed a request context, not an echo context. Thus, our middleware needs to write to the
|
|
// request context as well.
|
|
type RequestContext struct {
|
|
echo.Context
|
|
}
|
|
|
|
func NewRequestContext(ctx echo.Context) *RequestContext {
|
|
return &RequestContext{ctx}
|
|
}
|
|
|
|
func (e *RequestContext) Get(key string) interface{} {
|
|
return e.Request().Context().Value(key)
|
|
}
|
|
|
|
func (e *RequestContext) Set(key string, val interface{}) {
|
|
r := e.Request()
|
|
|
|
ctx := context.WithValue(e.Request().Context(), key, val)
|
|
|
|
e.SetRequest(r.Clone(ctx))
|
|
}
|
|
|
|
type GoContext struct {
|
|
context.Context
|
|
|
|
echoContext echo.Context
|
|
}
|
|
|
|
func NewGoContext(ctx context.Context, echoContext echo.Context) *GoContext {
|
|
return &GoContext{ctx, echoContext}
|
|
}
|
|
|
|
func (g *GoContext) Value(key any) interface{} {
|
|
// first search echo context
|
|
if keyStr, ok := key.(string); ok {
|
|
val := g.echoContext.Get(keyStr)
|
|
|
|
if val != nil {
|
|
return val
|
|
}
|
|
}
|
|
|
|
// then search go context
|
|
return g.Context.Value(key)
|
|
}
|