package geoip2 import ( "context" "errors" "fmt" "net/netip" "strings" ) // ErrNotFound is returned when the database does not contain the IP address. var ErrNotFound = errors.New("not found") // Info is a structure that contains information about the IP address. type Info struct { // IP is the IP address. IP netip.Addr // ISOCode is the ISO code of the country. ISOCode string // Continent is the continent. Continent string // Country is the country. Country string // City is the city. City string // CitySubdivisions is the list of subdivisions. CitySubdivisions []string // TimeZone is the time zone. TimeZone string } // ToString returns a string representation of the Info structure. func (i Info) ToString() string { var data []string if i.Continent != "" { data = append(data, i.Continent) } if i.ISOCode != "" { data = append(data, i.ISOCode) } if i.Country != "" { data = append(data, i.Country) } if len(i.CitySubdivisions) > 0 { data = append(data, strings.Join(i.CitySubdivisions, ", ")) } if i.City != "" { data = append(data, i.City) } return fmt.Sprintf("%s (%s) time zone: %s", i.IP.String(), strings.Join(data, "/"), i.TimeZone, ) } // GeoIP2 is an interface for geoip2. type GeoIP2 interface { Info(ip netip.Addr) (Info, error) } // RefreshableGeoIP2 is an interface for geoip2 with refresh and close functionality. type RefreshableGeoIP2 interface { GeoIP2 Refresh(ctx context.Context) error Close() error } // Logger is an interface for logging. type Logger interface { // Error logs an error. Error(err error) }