Files
addrss.io/internal/controllers/api.go
2025-09-14 14:35:36 -04:00

62 lines
1.2 KiB
Go

package controllers
import (
"addrss/pkg/postal"
"addrss/pkg/router"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
type Api struct{}
func (a Api) AddRoutes() {
router.AddGet("/suggestions", suggestions).Anonymous()
router.AddGet("/parse", parse).Anonymous()
}
func suggestions(ctx *router.Context) {
address, err := ctx.Request.Query("address")
if err != nil {
ctx.Response.BadRequest(err)
}
var parsedSlice []map[string]any
expansions := postal.ExpandAddress(address.(string))
for i := 0; i < len(expansions); i++ {
parsed := parseAddress(expansions[i])
parsedSlice = append(parsedSlice, parsed)
}
ctx.Response.OK(parsedSlice)
}
func parse(ctx *router.Context) {
address, err := ctx.Request.Query("address")
if err != nil {
ctx.Response.BadRequest(err)
}
parsed := parseAddress(address.(string))
ctx.Response.OK(parsed)
}
func parseAddress(address string) map[string]any {
pa := postal.ParseAddress(address)
addr := map[string]any{}
caser := cases.Caser{}
for i := 0; i < len(pa); i++ {
if pa[i].Label == "state" {
caser = cases.Upper(language.AmericanEnglish)
} else {
caser = cases.Title(language.AmericanEnglish)
}
addr[pa[i].Label] = caser.String(pa[i].Value)
}
return addr
}