package controllers import ( "addrss/pkg/postal" "addrss/pkg/router" ) 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{} for i := 0; i < len(pa); i++ { // This is hacky, but renaming in libpostal involves retraining the model. if pa[i].Label == "postcode" { pa[i].Label = "zip_code" } addr[pa[i].Label] = pa[i].Value } return addr }