package template import ( "bytes" "errors" "html/template" "log" "net/http" "os" "git.simponic.xyz/simponic/backup-notify/api/types" ) func renderTemplate(context *types.RequestContext, templateName string, showBaseHtml bool) (bytes.Buffer, error) { templatePath := context.Args.TemplatePath basePath := templatePath + "/base_empty.html" if showBaseHtml { basePath = templatePath + "/base.html" } templateLocation := templatePath + "/" + templateName tmpl, err := template.New("").ParseFiles(templateLocation, basePath) if err != nil { return bytes.Buffer{}, err } dataPtr := context.TemplateData if dataPtr == nil { dataPtr = &map[string]interface{}{} } data := *dataPtr var buffer bytes.Buffer err = tmpl.ExecuteTemplate(&buffer, "base", data) if err != nil { return bytes.Buffer{}, err } return buffer, nil } func TemplateContinuation(path string, showBase bool) types.Continuation { return func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain { return func(success types.Continuation, failure types.Continuation) types.ContinuationChain { html, err := renderTemplate(context, path, true) if errors.Is(err, os.ErrNotExist) { resp.WriteHeader(404) html, err = renderTemplate(context, "404.html", true) if err != nil { log.Println("error rendering 404 template", err) resp.WriteHeader(500) return failure(context, req, resp) } resp.Header().Set("Content-Type", "text/html") resp.Write(html.Bytes()) return failure(context, req, resp) } if err != nil { log.Println("error rendering template", err) resp.WriteHeader(500) resp.Write([]byte("error rendering template")) return failure(context, req, resp) } resp.Header().Set("Content-Type", "text/html") resp.Write(html.Bytes()) return success(context, req, resp) } } }