You've already forked openaccounting-server
mirror of
https://github.com/openaccounting/oa-server.git
synced 2025-12-09 00:50:59 +13:00
73 lines
2.3 KiB
Go
73 lines
2.3 KiB
Go
package rest
|
|
|
|
import (
|
|
"net/http"
|
|
)
|
|
|
|
// HandlerFunc defines the handler function. It is the go-json-rest equivalent of http.HandlerFunc.
|
|
type HandlerFunc func(ResponseWriter, *Request)
|
|
|
|
// App defines the interface that an object should implement to be used as an app in this framework
|
|
// stack. The App is the top element of the stack, the other elements being middlewares.
|
|
type App interface {
|
|
AppFunc() HandlerFunc
|
|
}
|
|
|
|
// AppSimple is an adapter type that makes it easy to write an App with a simple function.
|
|
// eg: rest.NewApi(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) { ... }))
|
|
type AppSimple HandlerFunc
|
|
|
|
// AppFunc makes AppSimple implement the App interface.
|
|
func (as AppSimple) AppFunc() HandlerFunc {
|
|
return HandlerFunc(as)
|
|
}
|
|
|
|
// Middleware defines the interface that objects must implement in order to wrap a HandlerFunc and
|
|
// be used in the middleware stack.
|
|
type Middleware interface {
|
|
MiddlewareFunc(handler HandlerFunc) HandlerFunc
|
|
}
|
|
|
|
// MiddlewareSimple is an adapter type that makes it easy to write a Middleware with a simple
|
|
// function. eg: api.Use(rest.MiddlewareSimple(func(h HandlerFunc) Handlerfunc { ... }))
|
|
type MiddlewareSimple func(handler HandlerFunc) HandlerFunc
|
|
|
|
// MiddlewareFunc makes MiddlewareSimple implement the Middleware interface.
|
|
func (ms MiddlewareSimple) MiddlewareFunc(handler HandlerFunc) HandlerFunc {
|
|
return ms(handler)
|
|
}
|
|
|
|
// WrapMiddlewares calls the MiddlewareFunc methods in the reverse order and returns an HandlerFunc
|
|
// ready to be executed. This can be used to wrap a set of middlewares, post routing, on a per Route
|
|
// basis.
|
|
func WrapMiddlewares(middlewares []Middleware, handler HandlerFunc) HandlerFunc {
|
|
wrapped := handler
|
|
for i := len(middlewares) - 1; i >= 0; i-- {
|
|
wrapped = middlewares[i].MiddlewareFunc(wrapped)
|
|
}
|
|
return wrapped
|
|
}
|
|
|
|
// Handle the transition between net/http and go-json-rest objects.
|
|
// It intanciates the rest.Request and rest.ResponseWriter, ...
|
|
func adapterFunc(handler HandlerFunc) http.HandlerFunc {
|
|
|
|
return func(origWriter http.ResponseWriter, origRequest *http.Request) {
|
|
|
|
// instantiate the rest objects
|
|
request := &Request{
|
|
origRequest,
|
|
nil,
|
|
map[string]interface{}{},
|
|
}
|
|
|
|
writer := &responseWriter{
|
|
origWriter,
|
|
false,
|
|
}
|
|
|
|
// call the wrapped handler
|
|
handler(writer, request)
|
|
}
|
|
}
|