package mmdb import ( "fmt" "net" "strings" "github.com/oschwald/maxminddb-golang" ) type geoip2Country struct { Country struct { IsoCode string `maxminddb:"iso_code"` } `maxminddb:"country"` } type IPReader struct { *maxminddb.Reader databaseType } type ASNReader struct { *maxminddb.Reader } type ASNResult struct { AutonomousSystemNumber uint32 `maxminddb:"autonomous_system_number"` AutonomousSystemOrganization string `maxminddb:"autonomous_system_organization"` } func (r IPReader) LookupCode(ipAddress net.IP) []string { switch r.databaseType { case typeMaxmind: var country geoip2Country _ = r.Lookup(ipAddress, &country) if country.Country.IsoCode == "" { return []string{} } return []string{strings.ToLower(country.Country.IsoCode)} case typeSing: var code string _ = r.Lookup(ipAddress, &code) if code == "" { return []string{} } return []string{code} case typeMetaV0: var record any _ = r.Lookup(ipAddress, &record) switch record := record.(type) { case string: return []string{record} case []any: // lookup returned type of slice is []any result := make([]string, 0, len(record)) for _, item := range record { result = append(result, item.(string)) } return result } return []string{} default: panic(fmt.Sprint("unknown geoip database type:", r.databaseType)) } } func (r ASNReader) LookupASN(ip net.IP) ASNResult { var result ASNResult r.Lookup(ip, &result) return result }