feat: initial release
This commit is contained in:
parent
a3cf21f5bd
commit
761174d035
41 changed files with 2008 additions and 217 deletions
53
internal/web/middleware/middleware.go
Normal file
53
internal/web/middleware/middleware.go
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
package middleware
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"slices"
|
||||
)
|
||||
|
||||
type Middleware interface {
|
||||
Client(r *http.Request) error
|
||||
Handler(http.Handler) http.Handler
|
||||
}
|
||||
|
||||
type BaseMiddleware struct{}
|
||||
|
||||
func (BaseMiddleware) Client(*http.Request) error { return nil }
|
||||
|
||||
func (BaseMiddleware) Handler(h http.Handler) http.Handler { return h }
|
||||
|
||||
type MiddlewareBuilder struct {
|
||||
middlewares []Middleware
|
||||
}
|
||||
|
||||
func (b *MiddlewareBuilder) Use(middleware Middleware) *MiddlewareBuilder {
|
||||
b.middlewares = append(b.middlewares, middleware)
|
||||
return b
|
||||
}
|
||||
|
||||
type middlewareProxy struct {
|
||||
middlewares []Middleware
|
||||
}
|
||||
|
||||
func (p *middlewareProxy) Client(r *http.Request) error {
|
||||
for _, m := range p.middlewares {
|
||||
if err := m.Client(r); err != nil {
|
||||
return fmt.Errorf("%T: %w", m, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *middlewareProxy) Handler(h http.Handler) http.Handler {
|
||||
for _, f := range slices.Backward(p.middlewares) {
|
||||
h = f.Handler(h)
|
||||
}
|
||||
return h
|
||||
}
|
||||
|
||||
func (b *MiddlewareBuilder) Prepare() Middleware {
|
||||
return &middlewareProxy{
|
||||
middlewares: append([]Middleware(nil), b.middlewares...),
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue