diff options
Diffstat (limited to 'lex-serve/main.go')
-rw-r--r-- | lex-serve/main.go | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/lex-serve/main.go b/lex-serve/main.go index 2996aef..cf8e9ae 100644 --- a/lex-serve/main.go +++ b/lex-serve/main.go @@ -11,6 +11,7 @@ import ( "net/url" "os" "path" + "slices" "strings" "sync" @@ -81,9 +82,7 @@ func main() { //go:embed templates var templates embed.FS -var tpl, _ = template.New("").Funcs(template.FuncMap{ - "ToUpper": strings.ToUpper, -}).Option("missingkey=error").ParseFS(templates, "templates/*") +var tpl, _ = template.New("").Option("missingkey=error").ParseFS(templates, "templates/*") type handler struct { logger *slog.Logger @@ -106,10 +105,29 @@ func (h *handler) handle(w http.ResponseWriter, r *http.Request) { w.Write([]byte("page not found")) return } + var firstTier []link + var secondTier []link + var thirdTier []link + for key, country := range h.countries { + link := link{ + URL: "//" + key + "." + h.domain, + Code: strings.ToUpper(key), + Name: country.Name, + } + if len(h.lawsByCC[key]) > 0 { + firstTier = append(firstTier, link) + } else if country.HasPlaceholder() { + secondTier = append(secondTier, link) + } else { + thirdTier = append(thirdTier, link) + } + } var html bytes.Buffer err := tpl.ExecuteTemplate(&html, "index.html.tmpl", map[string]any{ - "Countries": h.countries, - "Domain": r.Host, + "FirstTier": slices.SortedFunc(slices.Values(firstTier), compareLink), + "SecondTier": slices.SortedFunc(slices.Values(secondTier), compareLink), + "ThirdTier": slices.SortedFunc(slices.Values(thirdTier), compareLink), + "Domain": r.Host, }) if err != nil { h.logger.Error("failed to execute index template", Error(err)) @@ -204,4 +222,19 @@ func (c country) HasPlaceholder() bool { return strings.Contains(c.SearchURL, "%s") } +type link struct { + URL string + Code string + Name string +} + +func compareLink(a, b link) int { + if a.Code > b.Code { + return 1 + } else if a.Code < b.Code { + return -1 + } + return 0 +} + func Error(value error) slog.Attr { return slog.String("error", value.Error()) } |