From 51015256074ee17ecf7f3ea6115c2e1800575667 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Sun, 15 Mar 2026 00:22:28 -0600 Subject: [PATCH] accept multi search too --- cmd/run.go | 86 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/cmd/run.go b/cmd/run.go index 2551bd4..9337170 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -15,16 +15,14 @@ import ( func Run(ctx context.Context) error { fs := flag.NewFlagSet(os.Args[0], flag.ContinueOnError) searchRadius := fs.Float64("r", 5.0, "search radius in miles") - area := fs.Float64("a", 0.5, "result radius in miles") doArea := fs.Bool("d", false, "do result radius in miles") var towns FlagStringArray fs.Var(&towns, "t", "list of towns to search around") + searches := StringToFloat64{} + fs.Var(&searches, "s", "list of things to search for around each town") if err := fs.Parse(os.Args[1:]); err != nil { panic(err) } - radius := *area / convertToMiles - radiusX := 2 * radius / 2 - radiusY := 2 * radius / 3 type geoJson struct { Type string `json:"type"` @@ -38,34 +36,39 @@ func Run(ctx context.Context) error { } geoJsons := []geoJson{} for _, town := range towns { - m, err := NewMapsOf(ctx, town) - if err != nil { - return err - } - - results, err := m.Search(ctx, fs.Args()[0], *searchRadius) - if err != nil { - return err - } - - for i := range results { - var a geoJson - a.Type = "Feature" - a.Properties.Name = path.Join(fs.Args()[0], results[i].Name) - a.Geometry.Type = "Point" - a.Geometry.Coordinates = []any{results[i].Lng, results[i].Lat} - if *doArea { - a.Geometry.Type = "Polygon" - x, y := results[i].Lng, results[i].Lat - a.Geometry.Coordinates = []any{[]any{ - [2]float64{x, y + radiusY}, // top - [2]float64{x + radiusX, y}, // right - [2]float64{x, y - radiusY}, // bot - [2]float64{x - radiusX, y}, // left - [2]float64{x, y + radiusY}, // top - }} + for search, area := range searches { + radius := area / convertToMiles + radiusX := 2 * radius / 2 + radiusY := 2 * radius / 3 + m, err := NewMapsOf(ctx, town) + if err != nil { + return err + } + + results, err := m.Search(ctx, search, *searchRadius) + if err != nil { + return err + } + + for i := range results { + var a geoJson + a.Type = "Feature" + a.Properties.Name = path.Join(search, results[i].Name) + a.Geometry.Type = "Point" + a.Geometry.Coordinates = []any{results[i].Lng, results[i].Lat} + if *doArea { + a.Geometry.Type = "Polygon" + x, y := results[i].Lng, results[i].Lat + a.Geometry.Coordinates = []any{[]any{ + [2]float64{x, y + radiusY}, // top + [2]float64{x + radiusX, y}, // right + [2]float64{x, y - radiusY}, // bot + [2]float64{x - radiusX, y}, // left + [2]float64{x, y + radiusY}, // top + }} + } + geoJsons = append(geoJsons, a) } - geoJsons = append(geoJsons, a) } } log.Println(len(geoJsons)) @@ -95,3 +98,24 @@ func (array *FlagStringArray) Set(s string) error { *array = append(*array, s) return nil } + +type StringToFloat64 map[string]float64 + +func (array *StringToFloat64) String() string { + return fmt.Sprintf("%+v", (*map[string]float64)(array)) +} + +func (array *StringToFloat64) Set(s string) error { + idx := strings.Index(s, "=") + if idx < 0 { + return fmt.Errorf("should be formatted as k=v") + } + k := s[:idx] + v := s[idx+1:] + var n float64 + if err := json.Unmarshal([]byte(v), &n); err != nil { + return err + } + (*array)[k] = n + return nil +}