package fiber
import (
"github.com/gofiber/fiber/v2/log"
)
type (
OnRouteHandler = func (Route ) error
OnNameHandler = OnRouteHandler
OnGroupHandler = func (Group ) error
OnGroupNameHandler = OnGroupHandler
OnListenHandler = func (ListenData ) error
OnShutdownHandler = func () error
OnForkHandler = func (int ) error
OnMountHandler = func (*App ) error
)
type Hooks struct {
app *App
onRoute []OnRouteHandler
onName []OnNameHandler
onGroup []OnGroupHandler
onGroupName []OnGroupNameHandler
onListen []OnListenHandler
onShutdown []OnShutdownHandler
onFork []OnForkHandler
onMount []OnMountHandler
}
type ListenData struct {
Host string
Port string
TLS bool
}
func newHooks(app *App ) *Hooks {
return &Hooks {
app : app ,
onRoute : make ([]OnRouteHandler , 0 ),
onGroup : make ([]OnGroupHandler , 0 ),
onGroupName : make ([]OnGroupNameHandler , 0 ),
onName : make ([]OnNameHandler , 0 ),
onListen : make ([]OnListenHandler , 0 ),
onShutdown : make ([]OnShutdownHandler , 0 ),
onFork : make ([]OnForkHandler , 0 ),
onMount : make ([]OnMountHandler , 0 ),
}
}
func (h *Hooks ) OnRoute (handler ...OnRouteHandler ) {
h .app .mutex .Lock ()
h .onRoute = append (h .onRoute , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) OnName (handler ...OnNameHandler ) {
h .app .mutex .Lock ()
h .onName = append (h .onName , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) OnGroup (handler ...OnGroupHandler ) {
h .app .mutex .Lock ()
h .onGroup = append (h .onGroup , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) OnGroupName (handler ...OnGroupNameHandler ) {
h .app .mutex .Lock ()
h .onGroupName = append (h .onGroupName , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) OnListen (handler ...OnListenHandler ) {
h .app .mutex .Lock ()
h .onListen = append (h .onListen , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) OnShutdown (handler ...OnShutdownHandler ) {
h .app .mutex .Lock ()
h .onShutdown = append (h .onShutdown , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) OnFork (handler ...OnForkHandler ) {
h .app .mutex .Lock ()
h .onFork = append (h .onFork , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) OnMount (handler ...OnMountHandler ) {
h .app .mutex .Lock ()
h .onMount = append (h .onMount , handler ...)
h .app .mutex .Unlock ()
}
func (h *Hooks ) executeOnRouteHooks (route Route ) error {
if h .app .mountFields .mountPath != "" {
route .path = h .app .mountFields .mountPath + route .path
route .Path = route .path
}
for _ , v := range h .onRoute {
if err := v (route ); err != nil {
return err
}
}
return nil
}
func (h *Hooks ) executeOnNameHooks (route Route ) error {
if h .app .mountFields .mountPath != "" {
route .path = h .app .mountFields .mountPath + route .path
route .Path = route .path
}
for _ , v := range h .onName {
if err := v (route ); err != nil {
return err
}
}
return nil
}
func (h *Hooks ) executeOnGroupHooks (group Group ) error {
if h .app .mountFields .mountPath != "" {
group .Prefix = h .app .mountFields .mountPath + group .Prefix
}
for _ , v := range h .onGroup {
if err := v (group ); err != nil {
return err
}
}
return nil
}
func (h *Hooks ) executeOnGroupNameHooks (group Group ) error {
if h .app .mountFields .mountPath != "" {
group .Prefix = h .app .mountFields .mountPath + group .Prefix
}
for _ , v := range h .onGroupName {
if err := v (group ); err != nil {
return err
}
}
return nil
}
func (h *Hooks ) executeOnListenHooks (listenData ListenData ) error {
for _ , v := range h .onListen {
if err := v (listenData ); err != nil {
return err
}
}
return nil
}
func (h *Hooks ) executeOnShutdownHooks () {
for _ , v := range h .onShutdown {
if err := v (); err != nil {
log .Errorf ("failed to call shutdown hook: %v" , err )
}
}
}
func (h *Hooks ) executeOnForkHooks (pid int ) {
for _ , v := range h .onFork {
if err := v (pid ); err != nil {
log .Errorf ("failed to call fork hook: %v" , err )
}
}
}
func (h *Hooks ) executeOnMountHooks (app *App ) error {
for _ , v := range h .onMount {
if err := v (app ); err != nil {
return err
}
}
return nil
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .