package gus import "context" // Handler is a function which can turn a request into a response. // // A Handler can return a nil response, in which case the Server is expected // to build the protocol-appropriate "Not Found" response. type Handler func(context.Context, *Request) *Response // Middleware is a handler decorator. // // It returns a handler which may call the passed-in handler or not, or may // transform the request or response in some way. type Middleware func(Handler) Handler // FallthroughHandler builds a handler which tries multiple child handlers. // // The returned handler will invoke each of the passed-in handlers in order, // stopping when it receives a non-nil response. func FallthroughHandler(handlers ...Handler) Handler { return func(ctx context.Context, request *Request) *Response { for _, handler := range handlers { if response := handler(ctx, request); response != nil { return response } } return nil } } // Filter builds a middleware which only calls the wrapped Handler under a condition. // // When the condition function returns false it instead invokes the test-failure // handler. The failure handler may also be nil, in which case the final handler will // return a nil response whenever the condition fails. func Filter( condition func(context.Context, *Request) bool, failure Handler, ) Middleware { return func(success Handler) Handler { return func(ctx context.Context, request *Request) *Response { if condition(ctx, request) { return success(ctx, request) } if failure == nil { return nil } return failure(ctx, request) } } }