package router import ( "encoding/json" "io/fs" "net/http" "net/url" "git.0cd.xyz/michael/gtools/logger" "git.0cd.xyz/michael/gtools/tpl" "github.com/gorilla/mux" ) // Router Configuration type Router struct { router *mux.Router tplopts *tpl.Options page interface{} logger *logger.Logger fsys fs.FS } // NewRouter instance of new router func NewRouter(tplopts *tpl.Options, page interface{}, logger *logger.Logger, fsys fs.FS) *Router { return &Router{ router: mux.NewRouter(), tplopts: tplopts, page: page, logger: logger, fsys: fsys, } } // Router returns router func (re *Router) Router() *mux.Router { return re.router } // Response HTTP Response type Response struct { Title string Vars map[string]string Query url.Values Session map[interface{}]interface{} Body interface{} Status Status } // Status HTTP Status Code type Status struct { Status string StatusCode int } // HandlerFunc custom handler function that passes errors type HandlerFunc func(w http.ResponseWriter, r *http.Request) error func (f HandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { f(w, r) } // Response handles http respondes func (re *Router) Response(resp *Response, statuscode int) HandlerFunc { return func(w http.ResponseWriter, r *http.Request) error { re.logger.AccessMessage(r, statuscode) if statuscode >= 200 && statuscode <= 299 { re.RenderTemplate(resp).ServeHTTP(w, r) return nil } return HTTPError(statuscode, nil) } } // Respond responds with data json func (re *Router) Respond(data interface{}, status int) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { re.logger.AccessMessage(r, status) w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) if data != nil { if err := json.NewEncoder(w).Encode(data); err != nil { re.logger.Error.Errorf("faield to encode a response: %v", err) http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) } } } }