diff --git a/htmx_route.go b/htmx_route.go index 877bbec..26aee32 100644 --- a/htmx_route.go +++ b/htmx_route.go @@ -4,15 +4,18 @@ import ( "maragu.dev/gomponents" htmx "maragu.dev/gomponents-htmx" "net/http" + "strings" ) type HtmxContext interface { Render(node gomponents.Node) + SetError(err error) GetLanguage() Language GetActivePath() *ActivePath HasActivePath() bool SetActivePath(activePath *ActivePath) GetPath() string + GetPathParam(key string, defaultValue ...string) string } type HtmxContextImpl struct { @@ -22,6 +25,25 @@ type HtmxContextImpl struct { activePath *ActivePath } +func (c *HtmxContextImpl) SetError(err error) { + _, writeErr := c.res.Write([]byte(err.Error())) + if writeErr != nil { + Error("failed to write error", writeErr) + } + c.res.WriteHeader(500) +} + +func (c *HtmxContextImpl) GetPathParam(key string, defaultValue ...string) string { + pathParam := c.req.PathValue(key) + if pathParam != "" { + return pathParam + } + if len(defaultValue) > 0 { + return defaultValue[0] + } + return "" +} + func (c *HtmxContextImpl) GetPath() string { return c.req.URL.Path } @@ -50,11 +72,7 @@ func (c *HtmxContextImpl) Render(node gomponents.Node) { err := node.Render(c.res) if err != nil { Error("failed to render", err) - _, writeErr := c.res.Write([]byte(err.Error())) - if writeErr != nil { - Error("failed to write error", writeErr) - } - c.res.WriteHeader(500) + c.SetError(err) } } @@ -67,12 +85,16 @@ type HtmxPathParam struct { type HtmxRoute interface { WithPathParams(params ...HtmxPathParam) HtmxRoute - ToUrl(queryParams ...HtmxPathParam) string - GetHtmx(queryParams ...HtmxPathParam) gomponents.Node + ToUrl(language Language, queryParams ...HtmxPathParam) string + GetHtmx(language Language, queryParams ...HtmxPathParam) gomponents.Node SetActivePath(activePath *ActivePath) HtmxRoute Add(server *http.ServeMux) } +func addLanguageToPath(path string, language Language) string { + return "/" + string(language) + path +} + type HtmxGetRoute struct { Path string RouteFunc HtmxRouteFunc @@ -92,7 +114,7 @@ func NewHtmxGetRoute(path string, routeFunc HtmxRouteFunc, languages ...Language func (h HtmxGetRoute) Add(server *http.ServeMux) { for _, language := range h.Languages { - server.HandleFunc("GET /"+string(language)+h.Path, func(res http.ResponseWriter, req *http.Request) { + server.HandleFunc("GET "+addLanguageToPath(h.Path, language), func(res http.ResponseWriter, req *http.Request) { context := NewHtmxContext(req, res, language) if h.ActivePath != nil { context.SetActivePath(h.ActivePath) @@ -107,10 +129,17 @@ func (h HtmxGetRoute) WithPathParams(params ...HtmxPathParam) HtmxRoute { return h } -func (h HtmxGetRoute) ToUrl(queryParams ...HtmxPathParam) string { - return h.Path +func (h HtmxGetRoute) ToUrl(language Language, queryParams ...HtmxPathParam) string { + if len(h.PathParams) == 0 { + return h.Path + } + path := addLanguageToPath(h.Path, language) + for _, param := range h.PathParams { + path = strings.ReplaceAll(path, "{"+param.Key+"}", param.Value) + } + return path } -func (h HtmxGetRoute) GetHtmx(queryParams ...HtmxPathParam) gomponents.Node { - return htmx.Get(h.ToUrl(queryParams...)) +func (h HtmxGetRoute) GetHtmx(language Language, queryParams ...HtmxPathParam) gomponents.Node { + return htmx.Get(h.ToUrl(language, queryParams...)) } diff --git a/i18n.go b/i18n.go index 2a3abd8..84abb4b 100644 --- a/i18n.go +++ b/i18n.go @@ -21,7 +21,7 @@ type GlobalI18nImplementation struct { } func (g GlobalI18nImplementation) GetAllTexts() []I18nText { - allTexts := make([]I18nText, len(g.i18nTexts)) + var allTexts []I18nText for _, value := range g.i18nTexts { allTexts = append(allTexts, value) }