{{if .Results}} {{range .Results}} - {{template (templateForResult .Template) .}} + {{template .TemplateName .}} {{end}} {{else if not .Answers}}
diff --git a/internal/views/views.go b/internal/views/views.go index 5592235..58ef2eb 100644 --- a/internal/views/views.go +++ b/internal/views/views.go @@ -36,7 +36,12 @@ type PageData struct { } // ResultView is a template-friendly wrapper around a MainResult. -type ResultView contracts.MainResult +type ResultView struct { + contracts.MainResult + // TemplateName is the actual template to dispatch to, computed from Template. + // "videos" maps to "video_item", everything else maps to "result_item". + TemplateName string +} // PageNumber represents a numbered pagination button. type PageNumber struct { @@ -63,14 +68,6 @@ func init() { funcMap := template.FuncMap{ "urlquery": template.URLQueryEscaper, - // templateForResult returns the template name to use for a result. - // Defaults to "result_item"; use "video_item" for video results. - "templateForResult": func(tmpl string) string { - if tmpl == "videos" { - return "video_item" - } - return "result_item" - }, } tmplFull = template.Must(template.New("").Funcs(funcMap).ParseFS(tmplFS, @@ -113,7 +110,11 @@ func FromResponse(resp contracts.SearchResponse, query string, pageno int) PageD // Convert results. pd.Results = make([]ResultView, len(resp.Results)) for i, r := range resp.Results { - pd.Results[i] = ResultView(r) + tmplName := "result_item" + if r.Template == "videos" { + tmplName = "video_item" + } + pd.Results[i] = ResultView{MainResult: r, TemplateName: tmplName} } // Convert answers (they're map[string]any — extract string values).