package platform import ( _ "embed" "encoding/json" "fmt" "sort" "strings" ) // The user-supplied fleet number registry is bundled with the API release, so // labels and search always use the same version. VINs remain the identity key. // Source workbook, sheet and SHA-256 are recorded alongside the imported rows. // //go:embed data/vehicle_numbers.json var vehicleNumberData []byte var vehicleNumbers = loadVehicleNumbers(vehicleNumberData) func loadVehicleNumbers(data []byte) map[string]string { var source struct { Vehicles []struct { VIN string `json:"vin"` Number string `json:"number"` } `json:"vehicles"` } if err := json.Unmarshal(data, &source); err != nil { panic(fmt.Errorf("invalid vehicle number registry: %w", err)) } numbers := make(map[string]string, len(source.Vehicles)) for _, row := range source.Vehicles { vin, number := strings.ToUpper(strings.TrimSpace(row.VIN)), strings.TrimSpace(row.Number) if len(vin) != 17 || number == "" || numbers[vin] != "" { panic("invalid or duplicate VIN in vehicle number registry") } numbers[vin] = number } return numbers } func vehicleNumber(vin string) string { return vehicleNumbers[strings.ToUpper(strings.TrimSpace(vin))] } func vehicleNumberVINs(keywords []string, exact bool) []string { vins := []string{} for vin, number := range vehicleNumbers { for _, keyword := range keywords { keyword = strings.ToUpper(strings.TrimSpace(keyword)) if keyword == "" { continue } if exact && strings.EqualFold(number, keyword) || !exact && strings.Contains(strings.ToUpper(number), keyword) { vins = append(vins, vin) break } } } sort.Strings(vins) return vins }