package main // One-shot generator: reads the FIPS county CSV and emits // internal/awardref/uscounties_gen.go. Not part of the build. import ( "bufio" "fmt" "os" "sort" "strings" "hamlog/internal/award" ) // dxccForState maps the two US "states" that are separate DXCC entities. func dxccForState(st string) int { switch st { case "AK": return 6 case "HI": return 110 default: return 291 } } // territories we exclude — USA-CA is the 50 states (+ DC). var skipState = map[string]bool{"PR": true, "GU": true, "VI": true, "AS": true, "MP": true, "NA": true} func main() { f, err := os.Open(os.Args[1]) if err != nil { panic(err) } defer f.Close() type row struct{ code, name string; dxcc int } var rows []row seen := map[string]bool{} sc := bufio.NewScanner(f) sc.Scan() // header for sc.Scan() { line := sc.Text() parts := strings.SplitN(line, ",", 3) if len(parts) < 3 { continue } name := strings.TrimSpace(parts[1]) st := strings.TrimSpace(parts[2]) if skipState[st] || len(st) != 2 || strings.EqualFold(name, "UNITED STATES") { continue } // State header rows have an all-caps state NAME and state code "NA" // (already skipped). County rows have a 2-letter state code. code := award.USCountyKey(st, name) if code == "" || seen[code] { continue } seen[code] = true rows = append(rows, row{code: code, name: name + ", " + st, dxcc: dxccForState(st)}) } sort.Slice(rows, func(i, j int) bool { return rows[i].code < rows[j].code }) var b strings.Builder b.WriteString("// Code generated by cmd/cntygen from FIPS county data. DO NOT EDIT.\n") b.WriteString("package awardref\n\n") b.WriteString("// usCounties is the US Counties (USA-CA) reference list: one entry per county\n") b.WriteString("// in the 50 states, keyed by the canonical \"STATE,COUNTY\" match code that\n") b.WriteString("// award.usCountyKey produces from a QSO's state + cnty fields.\n") fmt.Fprintf(&b, "func usCounties() []Ref {\n\treturn []Ref{\n") for _, r := range rows { fmt.Fprintf(&b, "\t\tref(%q, %q, %d),\n", r.code, r.name, r.dxcc) } b.WriteString("\t}\n}\n") if err := os.WriteFile(os.Args[2], []byte(b.String()), 0o644); err != nil { panic(err) } fmt.Printf("wrote %d counties to %s\n", len(rows), os.Args[2]) }