vinegar/servlet/templateRoute.go
2023-08-01 16:06:43 -04:00

78 lines
2.4 KiB
Go

package servlet
import (
"net/http"
"strings"
)
type (
// TemplateRoute defines a template route in the router.
// It contains:
//
// VinegarWebRoute: The base VinegarWebRoute containing the URL pattern and handler.
//
// srv: The VinegarHttpServlet instance that this route is attached to.
//
// fileRoot: The base file path to serve files from for this template route.
//
// TemplateManager: The TemplateManager instance that manages templates for this route.
//
// UseCache: Whether to use caching for this template route.
TemplateRoute struct {
*VinegarWebRoute
srv *VinegarWebServlet
fileRoot string
TemplateManager *TemplateManager
UseCache bool
}
TemplateRouteHandlerFunc func(w http.ResponseWriter, r *http.Request, tm *TemplateManager)
)
// NewTemplateRoute creates and configures a new TemplateRoute.
//
// It accepts the following parameters:
//
// servlet - The VinegarWebServlet instance to attach the route to
//
// urlPattern - The URL regex pattern that the route will match
//
// templatePath - Filepath to the template files
//
// componentPath - Filepath to template component files
//
// handler - The handler function to call for this route
//
// It does the following:
//
// - Creates a TemplateManager instance using templatePath and componentPath
//
// - Generates a default route pattern by removing wildcards from urlPattern
//
// - Creates a VinegarWebRoute using the default pattern and a handler
// that calls the provided handler function
//
// - Creates a new TemplateRoute instance configured with the VinegarWebRoute,
// servlet, TemplateManager, and other settings
//
// - Returns a pointer to the TemplateRoute
func NewTemplateRoute(servlet *VinegarWebServlet, urlPattern string, templatePath string, componentPath string, handler TemplateRouteHandlerFunc) *TemplateRoute {
defaultPrune := strings.Replace(urlPattern, ".*", "", -1)
tm := NewTemplateManager(templatePath, componentPath)
rootRoute := NewServletRoute(defaultPrune, createTemplateRouteFunction(tm, handler))
route := TemplateRoute{
VinegarWebRoute: rootRoute,
srv: servlet,
fileRoot: "",
TemplateManager: tm,
UseCache: false,
}
return &route
}
func createTemplateRouteFunction(tm *TemplateManager, handler TemplateRouteHandlerFunc) VinegarHandlerFunction {
fun := func(w http.ResponseWriter, r *http.Request) {
handler(w, r, tm)
}
return fun
}