clustvirt/router/routes.go
2024-03-25 15:33:04 -06:00

58 lines
2.0 KiB
Go

package router
import (
"errors"
"fmt"
"net/http"
"git.staur.ca/stobbsm/clustvirt/cluster"
"git.staur.ca/stobbsm/clustvirt/lib/log"
)
type Routes []Route
func addprefix(b, p string) string { return fmt.Sprintf("%s%s", b, p) }
func trace(p string) string { return fmt.Sprintf("TRACE %s", p) }
func options(p string) string { return fmt.Sprintf("OPTIONS %s", p) }
func connect(p string) string { return fmt.Sprintf("CONNECT %s", p) }
func head(p string) string { return fmt.Sprintf("HEAD %s", p) }
func get(p string) string { return fmt.Sprintf("GET %s", p) }
func post(p string) string { return fmt.Sprintf("POST %s", p) }
func put(p string) string { return fmt.Sprintf("PUT %s", p) }
func patch(p string) string { return fmt.Sprintf("PATCH %s", p) }
func delete(p string) string { return fmt.Sprintf("DELETE %s", p) }
func (rte Routes) MountTo(prefix string, c *cluster.Cluster, mux *http.ServeMux) error {
var errs []error
for _, r := range rte {
switch r.Method {
case http.MethodTrace:
mux.Handle(trace(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodOptions:
mux.Handle(options(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodConnect:
mux.Handle(connect(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodHead:
mux.Handle(head(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodGet:
mux.Handle(get(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodPost:
mux.Handle(post(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodPut:
mux.Handle(put(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodPatch:
mux.Handle(patch(addprefix(prefix, r.Path)), r.Handler(c))
case http.MethodDelete:
mux.Handle(delete(addprefix(prefix, r.Path)), r.Handler(c))
default:
mux.Handle(addprefix(prefix, r.Path), r.Handler(c))
}
log.Info("Routes.MoutnTo").
Str("prefix", prefix).
Str("Route.Path", r.Path).
Str("Route.Method", r.Method).
Msg("route registered")
}
return errors.Join(errs...)
}