From 49bd3e0e0117768138f47f0c97accece15605025 Mon Sep 17 00:00:00 2001 From: Mathias Magnusson Date: Thu, 10 Apr 2025 21:33:41 +0200 Subject: extract value extracting and convertion to functions; support uuid --- cmd/generate/templates.go.tmpl | 92 ++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 58 deletions(-) (limited to 'cmd/generate/templates.go.tmpl') diff --git a/cmd/generate/templates.go.tmpl b/cmd/generate/templates.go.tmpl index 0e684e3..d33e069 100644 --- a/cmd/generate/templates.go.tmpl +++ b/cmd/generate/templates.go.tmpl @@ -1,19 +1,21 @@ // WARNING: this file has been automatically generated by -// codeberg.org/fooelevator/hh. DO NOT EDIT MANUALLY! +// codeberg.org/foodelevator/hh. DO NOT EDIT MANUALLY! package {{ .PackageName }} import ( - "net/http" + {{ range $_, $i := .Imports -}} + "{{ $i }}" + {{ end }} ) -func hhMountRoutes[S any](s S, mux *http.ServeMux) { +func hhMountRoutes(mux *http.ServeMux) { if mux == nil { mux = http.DefaultServeMux } - wrapper := func(handler func(s S, w http.ResponseWriter, r *http.Request)) http.Handler { + wrapper := func(handler func(w http.ResponseWriter, r *http.Request)) http.Handler { return http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { - handler(s, w, r) + handler(w, r) }) } @@ -23,73 +25,47 @@ func hhMountRoutes[S any](s S, mux *http.ServeMux) { } {{ range $_, $fn := .Functions }} -func hh_{{ $fn.Name }}[S any](s S, w http.ResponseWriter, r *http.Request) { +func hh_{{ $fn.Name }}(w http.ResponseWriter, r *http.Request) { + defer func() { + err := recover() + if err == nil { + return + } + w.WriteHeader(http.StatusInternalServerError) + id := uuid.New() + w.Write([]byte("Internal server error. id = " + id.String())) + slog.Error("Panic in handler", "handler", {{ quote $fn.Name }}, "id", id, "error", err) + }() {{- if $fn.DoParseForm }} if err := r.ParseForm(); err != nil { panic("todo: Bad request") } {{ end }} + var parsed {{ $fn.RequestTypeDef }} {{- range $_, $f := $fn.RequestTypeFields }} {{ if eq $f.TypeDef "*http.Request" }} {{ continue }} {{ end }} - var {{ $f.Name }}0 string - {{- if $f.Optional }} - {{ $f.Name }}Skipped := false - {{- end }} - {{- if eq $f.Extractor "form" }} - {{ $f.Name }}1 := r.Form[{{ $f.NameInReq | quote }}] - if len({{ $f.Name }}1) != 0 { - {{ $f.Name }}0 = {{ $f.Name }}1[0] - } else { - {{- if not $f.Optional }} - panic("todo: Bad request: form value " + {{ $f.NameInReq | quote }} + " missing") - {{- else }} - {{ $f.Name }}Skipped = true - {{- end }} - } - {{ else if eq $f.Extractor "path" }} - {{ $f.Name }}1 := r.PathValue({{ $f.NameInReq | quote }}) - if {{ $f.Name }}1 != "" { - {{ $f.Name }}0 = {{ $f.Name }}1 - } else { - {{- if not $f.Optional }} - panic("todo: Bad request: path value " + {{ $f.NameInReq | quote }} + " missing") - {{- else }} - {{ $f.Name }}Skipped = true - {{- end }} - } - {{ else if eq $f.Extractor "cookie" }} - {{ $f.Name }}1, _ := r.Cookie({{ $f.NameInReq | quote }}) - if {{ $f.Name }}1 != nil { - {{ $f.Name }}0 = {{ $f.Name }}1.Value - } else { - {{- if not $f.Optional }} - panic("todo: Bad request: cookie " + {{ $f.NameInReq | quote }} + " missing") - {{- else }} - {{ $f.Name }}Skipped = true - {{- end }} + {{ $f.Name }}, {{ $f.Name }}Skipped := {{ extractorName $f.Extractor }}(r, {{ $f.NameInReq | quote }}) + {{ if not $f.Optional }} + if {{ $f.Name }}Skipped { + panic("todo: Bad request: " + {{ $f.Extractor | quote }} + " value " + {{ $f.NameInReq | quote }} + " missing") } - {{ else }} - {{ error "unknown extractor" }} - {{ end -}} - {{ if eq $f.TypeDef "string" -}} - {{ $f.Name }} := {{ $f.Name }}0 - {{ else if eq $f.TypeDef "int" -}} - var {{ $f.Name }} int - {{ if $f.Optional }} if !{{ $f.Name }}Skipped { {{ end -}} - var err error - {{ $f.Name }}, err = strconv.Atoi({{ $f.Name }}0) - if err != nil { - panic("todo: Bad request: " + {{ $f.NameInReq | quote }} + " must be a valid int") - } - {{ if $f.Optional }} } {{ end }} {{ end }} + + {{ if $f.Optional }} if !{{ $f.Name }}Skipped {{ end -}} { + var err error + parsed.{{ $f.Name }}, err = {{ converterName $f.TypeDef }}({{ $f.Name }}) + if err != nil { + panic("todo: Bad request: " + {{ $f.NameInReq | quote }} + " must be a valid " + {{ $f.TypeDef | quote }}) + } + } {{ end }} - {{ $fn.Name }}(w, {{ $fn.RequestTypeDef }}{ + {{ $fn.Name }}(w, parsed) + {{ if false }} {{ range $_, $f := $fn.RequestTypeFields -}} {{ $f.Name }}: {{ $f.Name }}, {{ end }} - }) + {{ end }} } {{ end }} -- cgit v1.2.3