From f1c0055710b695e0c481045710071aaf95182a34 Mon Sep 17 00:00:00 2001 From: Achim Rohn Date: Wed, 13 Aug 2025 14:16:59 +0200 Subject: [PATCH] Add CommonHtmxRoute making it easy to create a Post method --- htmx_route.go | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/htmx_route.go b/htmx_route.go index ffa4e33..d9a50d2 100644 --- a/htmx_route.go +++ b/htmx_route.go @@ -96,29 +96,32 @@ func addLanguageToPath(path string, language Language) string { return "/" + string(language) + path } -type HtmxGetRoute struct { +type CommonHtmxRoute struct { Paths LanguagePaths RouteFunc HtmxRouteFunc PathParams []HtmxPathParam ActivePath *ActivePath + Method string + HtmxMethod HtmxHttpMethodFunction } -func (h HtmxGetRoute) Execute(c HtmxContext) { +func NewCommonHtmxRoute(routeFunc HtmxRouteFunc, paths LanguagePaths, method string, + htmxMethod HtmxHttpMethodFunction) *CommonHtmxRoute { + return &CommonHtmxRoute{RouteFunc: routeFunc, Paths: paths, Method: method, HtmxMethod: htmxMethod} +} + +func (h CommonHtmxRoute) Execute(c HtmxContext) { h.RouteFunc(c) } -func (h HtmxGetRoute) SetActivePath(activePath *ActivePath) HtmxRoute { +func (h CommonHtmxRoute) SetActivePath(activePath *ActivePath) HtmxRoute { h.ActivePath = activePath return h } -func NewHtmxGetRoute(routeFunc HtmxRouteFunc, paths LanguagePaths) *HtmxGetRoute { - return &HtmxGetRoute{RouteFunc: routeFunc, Paths: paths} -} - -func (h HtmxGetRoute) Add(server *http.ServeMux) { +func (h CommonHtmxRoute) AddWithMethod(method string, server *http.ServeMux) { for language, path := range h.Paths { - server.HandleFunc("GET "+addLanguageToPath(path, language), func(res http.ResponseWriter, req *http.Request) { + server.HandleFunc(method+" "+addLanguageToPath(path, language), func(res http.ResponseWriter, req *http.Request) { context := NewHtmxContext(req, res, language) if h.ActivePath != nil { context.SetActivePath(h.ActivePath) @@ -128,12 +131,16 @@ func (h HtmxGetRoute) Add(server *http.ServeMux) { } } -func (h HtmxGetRoute) WithPathParams(params ...HtmxPathParam) HtmxRoute { +func (h CommonHtmxRoute) Add(server *http.ServeMux) { + h.AddWithMethod(h.Method, server) +} + +func (h CommonHtmxRoute) WithPathParams(params ...HtmxPathParam) HtmxRoute { h.PathParams = params return h } -func (h HtmxGetRoute) ToUrl(language Language, queryParams ...HtmxPathParam) string { +func (h CommonHtmxRoute) ToUrl(language Language, queryParams ...HtmxPathParam) string { path := addLanguageToPath(h.Paths[language], language) if len(h.PathParams) == 0 { return path @@ -144,8 +151,22 @@ func (h HtmxGetRoute) ToUrl(language Language, queryParams ...HtmxPathParam) str return path } -func (h HtmxGetRoute) GetHtmx(language Language, queryParams ...HtmxPathParam) gomponents.Node { - return htmx.Get(h.ToUrl(language, queryParams...)) +type HtmxHttpMethodFunction func(url string) gomponents.Node + +func (h CommonHtmxRoute) GetHtmxFromMethod(method HtmxHttpMethodFunction, language Language, queryParams ...HtmxPathParam) gomponents.Node { + return method(h.ToUrl(language, queryParams...)) +} + +func (h CommonHtmxRoute) GetHtmx(language Language, queryParams ...HtmxPathParam) gomponents.Node { + return h.GetHtmxFromMethod(h.HtmxMethod, language, queryParams...) +} + +func NewHtmxGetRoute(routeFunc HtmxRouteFunc, paths LanguagePaths) HtmxRoute { + return NewCommonHtmxRoute(routeFunc, paths, "GET", htmx.Get) +} + +func NewHtmxPostRoute(routeFunc HtmxRouteFunc, paths LanguagePaths) HtmxRoute { + return NewCommonHtmxRoute(routeFunc, paths, "POST", htmx.Post) } func HandleStaticAndDefaultPath(server *http.ServeMux, defaultRoute HtmxRoute, defaultLanguage Language) func(http.ResponseWriter, *http.Request) {