Documentation
¶
Index ¶
- Constants
- Variables
- func BatchParseSeq(inputs []string) iter.Seq2[int, Result[Postcode]]
- func Coordinates(raw string) (lat, lng float64, err error)
- func GoogleMapsURL(raw string) (string, error)
- func ParseSeq(inputs []string) iter.Seq2[Postcode, error]
- func RegisterKnownBuilding(rec BuildingRecord)
- type APIError
- type AdministrativeAddress
- type AssembledPostcode
- type AutocompleteResponse
- type AutocompleteSuggestion
- type BuildingRecord
- type Client
- func (c *Client) Assemble(ctx context.Context, segs Segments) (*AssembledPostcode, error)
- func (c *Client) Autocomplete(ctx context.Context, query string) (*AutocompleteResponse, error)
- func (c *Client) Disassemble(ctx context.Context, code string) (*Segments, error)
- func (c *Client) Lookup(ctx context.Context, code string, level LookupLevel) (*LookupResponse, error)
- func (c *Client) Nearby(ctx context.Context, params NearbyParams) (*NearbyResponse, error)
- func (c *Client) RateLimit() *RateLimitInfo
- func (c *Client) ResolveLocation(ctx context.Context, code string) (*Location, error)
- func (c *Client) Reverse(ctx context.Context, params ReverseParams) (*ReverseResponse, error)
- type ClientOption
- func WithAPIKey(key string) ClientOption
- func WithBaseTransport(rt http.RoundTripper) ClientOption
- func WithBaseURL(customURL string) ClientOption
- func WithRateLimitRetry(enabled bool, maxDelay time.Duration) ClientOption
- func WithRetryConfig(cfg RetryConfig) ClientOption
- func WithTelemetry(t Telemetry) ClientOption
- func WithTimeout(d time.Duration) ClientOption
- func WithTransport(rt http.RoundTripper) ClientOption
- type LGARecord
- type Location
- type LookupLevel
- type LookupResponse
- type MetricsRecorder
- type NearbyParams
- type NearbyResponse
- type NearbyUnit
- type PointGeometry
- type Postcode
- func (p Postcode) AppendText(b []byte) ([]byte, error)
- func (p Postcode) Area() string
- func (p Postcode) BuildingUnit() string
- func (p Postcode) Coordinates() (lat, lng float64)
- func (p Postcode) District() string
- func (p Postcode) Formatted() string
- func (p Postcode) GoogleMapsURL() string
- func (p Postcode) IsZero() bool
- func (p Postcode) LGA() string
- func (p Postcode) Location() Location
- func (p Postcode) MarshalText() ([]byte, error)
- func (p Postcode) Raw() string
- func (p Postcode) State() string
- func (p Postcode) String() string
- func (p *Postcode) UnmarshalText(text []byte) error
- type Precision
- type RateLimitInfo
- type RecentHouseAddress
- type Result
- type RetryConfig
- type RetryTransport
- type ReverseParams
- type ReverseResponse
- type Segments
- type Span
- type StateRecord
- type Telemetry
- type Tracer
Constants ¶
const (
DefaultBaseURL = "https://api.postcode.gov.ng"
)
Variables ¶
var ( ErrInvalidLength = errors.New("postcode: invalid length, must be exactly 11 alphanumeric characters") ErrInvalidFormat = errors.New("postcode: invalid format structure") )
var ErrUnknownState = errors.New("postcode: unknown nigerian state code")
ErrUnknownState indicates that a postcode has a state prefix not recognized in the Nigerian state registry.
var NigerianStates = map[string]StateRecord{
"AB": {Code: "AB", Name: "Abia", Capital: "Umuahia", Latitude: 5.5320, Longitude: 7.4860, Zone: "SOUTH EAST"},
"AD": {Code: "AD", Name: "Adamawa", Capital: "Yola", Latitude: 9.2094, Longitude: 12.4818, Zone: "NORTH EAST"},
"AK": {Code: "AK", Name: "Akwa Ibom", Capital: "Uyo", Latitude: 5.0377, Longitude: 7.9128, Zone: "SOUTH SOUTH"},
"AN": {Code: "AN", Name: "Anambra", Capital: "Awka", Latitude: 6.2209, Longitude: 7.0670, Zone: "SOUTH EAST"},
"BA": {Code: "BA", Name: "Bauchi", Capital: "Bauchi", Latitude: 10.3158, Longitude: 9.8442, Zone: "NORTH EAST"},
"BY": {Code: "BY", Name: "Bayelsa", Capital: "Yenagoa", Latitude: 4.9267, Longitude: 6.2676, Zone: "SOUTH SOUTH"},
"BN": {Code: "BN", Name: "Benue", Capital: "Makurdi", Latitude: 7.7304, Longitude: 8.5211, Zone: "NORTH CENTRAL"},
"BO": {Code: "BO", Name: "Borno", Capital: "Maiduguri", Latitude: 11.8333, Longitude: 13.1500, Zone: "NORTH EAST"},
"CR": {Code: "CR", Name: "Cross River", Capital: "Calabar", Latitude: 4.9757, Longitude: 8.3417, Zone: "SOUTH SOUTH"},
"DE": {Code: "DE", Name: "Delta", Capital: "Asaba", Latitude: 6.1984, Longitude: 6.7329, Zone: "SOUTH SOUTH"},
"EB": {Code: "EB", Name: "Ebonyi", Capital: "Abakaliki", Latitude: 6.3249, Longitude: 8.1137, Zone: "SOUTH EAST"},
"ED": {Code: "ED", Name: "Edo", Capital: "Benin City", Latitude: 6.3350, Longitude: 5.6037, Zone: "SOUTH SOUTH"},
"EK": {Code: "EK", Name: "Ekiti", Capital: "Ado Ekiti", Latitude: 7.6211, Longitude: 5.2215, Zone: "SOUTH WEST"},
"EN": {Code: "EN", Name: "Enugu", Capital: "Enugu", Latitude: 6.4584, Longitude: 7.5464, Zone: "SOUTH EAST"},
"FC": {Code: "FC", Name: "Federal Capital Territory", Capital: "Abuja", Latitude: 9.0579, Longitude: 7.4951, Zone: "NORTH CENTRAL"},
"GO": {Code: "GO", Name: "Gombe", Capital: "Gombe", Latitude: 10.2897, Longitude: 11.1711, Zone: "NORTH EAST"},
"IM": {Code: "IM", Name: "Imo", Capital: "Owerri", Latitude: 5.4858, Longitude: 7.0355, Zone: "SOUTH EAST"},
"JI": {Code: "JI", Name: "Jigawa", Capital: "Dutse", Latitude: 11.7594, Longitude: 9.3389, Zone: "NORTH WEST"},
"KD": {Code: "KD", Name: "Kaduna", Capital: "Kaduna", Latitude: 10.5105, Longitude: 7.4165, Zone: "NORTH WEST"},
"KN": {Code: "KN", Name: "Kano", Capital: "Kano", Latitude: 12.0022, Longitude: 8.5920, Zone: "NORTH WEST"},
"KT": {Code: "KT", Name: "Katsina", Capital: "Katsina", Latitude: 12.9855, Longitude: 7.6171, Zone: "NORTH WEST"},
"KE": {Code: "KE", Name: "Kebbi", Capital: "Birnin Kebbi", Latitude: 12.4504, Longitude: 4.1999, Zone: "NORTH WEST"},
"KO": {Code: "KO", Name: "Kogi", Capital: "Lokoja", Latitude: 7.8023, Longitude: 6.7333, Zone: "NORTH CENTRAL"},
"KW": {Code: "KW", Name: "Kwara", Capital: "Ilorin", Latitude: 8.4966, Longitude: 4.5421, Zone: "NORTH CENTRAL"},
"LA": {Code: "LA", Name: "Lagos", Capital: "Ikeja", Latitude: 6.6018, Longitude: 3.3515, Zone: "SOUTH WEST"},
"NA": {Code: "NA", Name: "Nasarawa", Capital: "Lafia", Latitude: 8.4932, Longitude: 8.5153, Zone: "NORTH CENTRAL"},
"NI": {Code: "NI", Name: "Niger", Capital: "Minna", Latitude: 9.6139, Longitude: 6.5569, Zone: "NORTH CENTRAL"},
"OG": {Code: "OG", Name: "Ogun", Capital: "Abeokuta", Latitude: 7.1475, Longitude: 3.3619, Zone: "SOUTH WEST"},
"ON": {Code: "ON", Name: "Ondo", Capital: "Akure", Latitude: 7.2571, Longitude: 5.2058, Zone: "SOUTH WEST"},
"OS": {Code: "OS", Name: "Osun", Capital: "Osogbo", Latitude: 7.7827, Longitude: 4.5418, Zone: "SOUTH WEST"},
"OY": {Code: "OY", Name: "Oyo", Capital: "Ibadan", Latitude: 7.3775, Longitude: 3.9470, Zone: "SOUTH WEST"},
"PL": {Code: "PL", Name: "Plateau", Capital: "Jos", Latitude: 9.9271, Longitude: 8.8921, Zone: "NORTH CENTRAL"},
"RI": {Code: "RI", Name: "Rivers", Capital: "Port Harcourt", Latitude: 4.8156, Longitude: 7.0498, Zone: "SOUTH SOUTH"},
"SO": {Code: "SO", Name: "Sokoto", Capital: "Sokoto", Latitude: 13.0609, Longitude: 5.2476, Zone: "NORTH WEST"},
"TA": {Code: "TA", Name: "Taraba", Capital: "Jalingo", Latitude: 8.8937, Longitude: 11.3600, Zone: "NORTH EAST"},
"YO": {Code: "YO", Name: "Yobe", Capital: "Damaturu", Latitude: 11.7470, Longitude: 11.9608, Zone: "NORTH EAST"},
"ZA": {Code: "ZA", Name: "Zamfara", Capital: "Gusau", Latitude: 12.1702, Longitude: 6.6592, Zone: "NORTH WEST"},
}
NigerianStates contains geographic centroids and administrative capitals for all 36 States and FCT.
Functions ¶
func BatchParseSeq ¶
BatchParseSeq yields an iter.Seq2 iterator with slice index and Result wrapper.
func Coordinates ¶ added in v0.1.1
Coordinates parses any valid 11-character Nigerian postcode string and returns its latitude and longitude coordinates.
func GoogleMapsURL ¶ added in v0.1.1
GoogleMapsURL parses any valid 11-character Nigerian postcode string and directly generates its Google Maps location URL.
func RegisterKnownBuilding ¶ added in v0.1.1
func RegisterKnownBuilding(rec BuildingRecord)
RegisterKnownBuilding allows applications to register custom building units into the offline geocoding cache.
Types ¶
type APIError ¶
type APIError struct {
StatusCode int `json:"-"`
Code string `json:"code"`
Message string `json:"message"`
RateLimit *RateLimitInfo `json:"-"`
RetryAfter time.Duration `json:"-"`
}
APIError represents an error returned by the NIPOST Postcode API gateway.
func (*APIError) IsInsufficientCredits ¶
func (*APIError) IsNotFound ¶
func (*APIError) IsRateLimit ¶
func (*APIError) IsUnauthorized ¶
func (*APIError) UnmarshalJSON ¶
UnmarshalJSON handles both the official nested envelope {"error": {"code": ..., "message": ...}} and flat payloads {"code": ..., "message": ...}.
type AdministrativeAddress ¶
type AdministrativeAddress struct {
State string `json:"state,omitempty"`
StateName string `json:"state_name,omitempty"`
LGA string `json:"lga,omitempty"`
LGAName string `json:"lga_name,omitempty"`
District string `json:"district,omitempty"`
DistrictName string `json:"district_name,omitempty"`
Area string `json:"area,omitempty"`
AreaName string `json:"area_name,omitempty"`
Unit string `json:"unit,omitempty"`
Zone string `json:"zone,omitempty"`
LocalityName string `json:"locality_name,omitempty"`
}
AdministrativeAddress details administrative boundaries up to area level (L2+).
type AssembledPostcode ¶
type AssembledPostcode struct {
Postcode string `json:"postcode"` // Canonical: "EK-01-A03-FK-01"
Display string `json:"display"` // Spaced: "EK 01 A03 FK 01"
Compact string `json:"compact"` // Compact: "EK01A03FK01"
}
AssembledPostcode represents the output of POST /v1/assembly/assemble.
type AutocompleteResponse ¶
type AutocompleteResponse struct {
Segment string `json:"segment"`
Suggestions []AutocompleteSuggestion `json:"suggestions"`
}
AutocompleteResponse contains suggestions for the currently active segment.
type AutocompleteSuggestion ¶
AutocompleteSuggestion represents an individual suggestion returned by autocomplete.
type BuildingRecord ¶ added in v0.1.1
type BuildingRecord struct {
Postcode string // Canonical (e.g. "EK-01-A03-FK-01") or Compact ("EK01A03FK01")
Latitude float64
Longitude float64
Address string
StateCode string
StateName string
LGACode string
LGAName string
Zone string
}
BuildingRecord holds high-precision point geometry for a specific building unit.
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
func NewClient ¶
func NewClient(opts ...ClientOption) (*Client, error)
NewClient instantiates a production-tuned HTTP client.
func (*Client) Assemble ¶
Assemble builds canonical, display, and compact postcodes from individual segments.
func (*Client) Autocomplete ¶
Autocomplete retrieves segment-aware suggestions for a partial postcode input (e.g. "EK 01 A").
func (*Client) Disassemble ¶
Disassemble decomposes a postcode string into its 5 structural segments.
func (*Client) Lookup ¶
func (c *Client) Lookup(ctx context.Context, code string, level LookupLevel) (*LookupResponse, error)
Lookup queries the gateway for detailed attributes of a postcode. Level defaults to Level1 (free) if 0 or unspecified.
func (*Client) Nearby ¶
func (c *Client) Nearby(ctx context.Context, params NearbyParams) (*NearbyResponse, error)
Nearby searches for active postcode units within a radius (default 300m) of a coordinate.
func (*Client) RateLimit ¶
func (c *Client) RateLimit() *RateLimitInfo
RateLimit returns the most recent rate limit quotas reported by the NIPOST gateway, or nil if no request has yet returned rate limit headers.
func (*Client) ResolveLocation ¶ added in v0.1.1
ResolveLocation resolves an 11-character Nigerian postcode to its geographic Location and Google Maps URL. It queries the NIPOST gateway at the official public Level 3 (or Level 2 for street & administrative address enrichment), checks for any custom point geometry, and leverages the SDK's high-precision offline reference geocoding engine to guarantee reliable coordinates and Google Maps URLs.
func (*Client) Reverse ¶
func (c *Client) Reverse(ctx context.Context, params ReverseParams) (*ReverseResponse, error)
Reverse resolves a geographic coordinate to the nearest active postcode unit.
type ClientOption ¶
type ClientOption func(*Client)
func WithAPIKey ¶
func WithAPIKey(key string) ClientOption
WithAPIKey sets the NIPOST API key sent in the X-API-Key header. An apiKey is optional for public endpoints (L1 lookup, search, assembly).
func WithBaseTransport ¶
func WithBaseTransport(rt http.RoundTripper) ClientOption
WithBaseTransport sets the underlying round tripper underneath the retry middleware.
func WithBaseURL ¶
func WithBaseURL(customURL string) ClientOption
WithBaseURL overrides the default gateway URL (e.g. for testing with httptest.Server).
func WithRateLimitRetry ¶
func WithRateLimitRetry(enabled bool, maxDelay time.Duration) ClientOption
WithRateLimitRetry configures automatic retry on 429 Too Many Requests responses. If enabled is false, 429 responses will not be retried. maxDelay sets the maximum duration the client is willing to sleep for a rate limit cooldown.
func WithRetryConfig ¶
func WithRetryConfig(cfg RetryConfig) ClientOption
WithRetryConfig configures backoff, jitter, and retry limits.
func WithTelemetry ¶
func WithTelemetry(t Telemetry) ClientOption
WithTelemetry registers custom observability hooks.
func WithTimeout ¶
func WithTimeout(d time.Duration) ClientOption
WithTimeout sets the overall client request timeout.
func WithTransport ¶
func WithTransport(rt http.RoundTripper) ClientOption
WithTransport explicitly overrides the entire round tripper stack (bypassing retries).
type LGARecord ¶ added in v0.1.1
type LGARecord struct {
StateCode string
LGACode string
Name string
Latitude float64
Longitude float64
}
LGARecord holds reference coordinates and names for an LGA within a state.
type Location ¶ added in v0.1.1
type Location struct {
Postcode string `json:"postcode"` // Canonical hyphenated: "EK-01-A03-FK-01"
Compact string `json:"compact"` // Compact 11-char: "EK01A03FK01"
Latitude float64 `json:"latitude"` // Geographic latitude (-90 to +90)
Longitude float64 `json:"longitude"` // Geographic longitude (-180 to +180)
Address string `json:"address,omitempty"` // Known street/building address if available
StateCode string `json:"state_code"` // 2-letter state code (e.g. "EK")
StateName string `json:"state_name"` // Full state name (e.g. "Ekiti")
LGACode string `json:"lga_code,omitempty"` // 2-digit LGA code (e.g. "01")
LGAName string `json:"lga_name,omitempty"` // Full LGA name (e.g. "Ado Ekiti")
Zone string `json:"zone,omitempty"` // Geopolitical zone (e.g. "SOUTH WEST")
Precision Precision `json:"precision"` // Coordinate precision tier (placed at end to minimize struct alignment padding)
}
Location encapsulates geographic coordinates, address descriptors, and mapping URLs.
func ResolveLocation ¶ added in v0.1.1
ResolveLocation parses any valid 11-character Nigerian postcode string (compact, hyphenated, or spaced) and returns its resolved geographic Location. Uses local administrative reference data without requiring network calls.
func (Location) AppleMapsURL ¶ added in v0.1.1
AppleMapsURL returns an Apple Maps URL for iOS/macOS devices. Format: https://maps.apple.com/?ll=lat,lng&q=...
func (Location) Coordinates ¶ added in v0.1.1
Coordinates returns the latitude and longitude as a float64 pair.
func (Location) GoogleMapsDirectionsURL ¶ added in v0.1.1
GoogleMapsDirectionsURL returns a Google Maps navigation/directions URL to this location. Format: https://www.google.com/maps/dir/?api=1&destination=lat,lng
func (Location) GoogleMapsURL ¶ added in v0.1.1
GoogleMapsURL returns a standard, universal Google Maps search URL with exact coordinates. Format: https://www.google.com/maps/search/?api=1&query=lat,lng
func (Location) IsZero ¶ added in v0.1.1
IsZero reports whether the location represents a zero/uninitialized value.
func (Location) OpenStreetMapURL ¶ added in v0.1.1
OpenStreetMapURL returns an OpenStreetMap pin URL.
func (Location) SearchQuery ¶ added in v0.1.1
SearchQuery produces a descriptive location query string suitable for search engines (e.g. "Ado Ekiti, Ekiti State, Nigeria" or "Abuja Municipal, Federal Capital Territory, Nigeria").
type LookupLevel ¶
type LookupLevel int
LookupLevel specifies the depth of attributes returned by a lookup request. Per official NIPOST documentation (docs.postcode.gov.ng/concepts/lookup-levels): Lookup responses are graded into 3 cumulative levels (L1–L3):
- Level 1 (Free, Public): Validity status (valid: true/false) and canonical postcode.
- Level 2 (Commercial): Administrative address (state, LGA, district, area) and street address.
- Level 3 (Commercial): Full building use status (residential, commercial, mixed, etc.) and all lower levels.
Standard commercial API keys are strictly capped at Level 3 (LevelMax). Attempting to request a level higher than your organization's granted quota yields a 403 Forbidden ("key lacks scope or level").
Note on Level 4 & Level 5: In raw backend OpenAPI schemas (docs.postcode.gov.ng/api-reference/graded-postcode-lookup-levels-1–5-cumulative), levels 4 and 5 represent unreleased or restricted government tiers:
- Level 4: other_building_info (unreleased building metadata)
- Level 5: point_geometry (restricted government GIS coordinates)
Standard commercial keys do NOT have access to L4/L5. The SDK defines Level4 and Level5 for backward compatibility and private enterprise mock environments.
const ( LevelDefault LookupLevel = 0 // Default to Level 1 Level1 LookupLevel = 1 // Free: Validity check and canonical postcode Level2 LookupLevel = 2 // Commercial: Administrative boundaries and street address Level3 LookupLevel = 3 // Commercial: Building use status and unit metadata (Official Maximum) LevelMax LookupLevel = 3 // Standard commercial maximum level (L3) // Restricted / Internal tiers (not accessible with standard API keys): Level4 LookupLevel = 4 // Internal/Enterprise: Additional building info Level5 LookupLevel = 5 // Restricted: High-precision point geometry (requires special government grant) )
type LookupResponse ¶
type LookupResponse struct {
Postcode string `json:"postcode"`
Valid bool `json:"valid"`
AdministrativeAddress *AdministrativeAddress `json:"administrative_address,omitempty"`
RecentHouseAddress *RecentHouseAddress `json:"recent_house_address,omitempty"`
BuildingUseStatus string `json:"building_use_status,omitempty"`
OtherBuildingInfo map[string]any `json:"other_building_info,omitempty"`
PointGeometry *PointGeometry `json:"point_geometry,omitempty"`
}
LookupResponse represents the graded attributes returned by GET /v1/lookup.
type MetricsRecorder ¶
type MetricsRecorder interface {
RecordDuration(ctx context.Context, method, endpoint string, statusCode int, duration time.Duration)
AddInflight(ctx context.Context, delta int64)
}
MetricsRecorder defines standard metrics contracts for client operations.
type NearbyParams ¶
type NearbyParams struct {
Latitude float64
Longitude float64
RadiusM float64 // Search radius in meters (default 300, max 300)
}
NearbyParams configures location search around a geographic coordinate.
type NearbyResponse ¶
type NearbyResponse struct {
Results []NearbyUnit `json:"results"`
}
NearbyResponse contains location units within the requested radius.
type NearbyUnit ¶
type NearbyUnit struct {
Postcode string `json:"postcode"`
Display string `json:"display"`
DistanceM float64 `json:"distance_m"`
Confidence string `json:"confidence"`
StateName string `json:"state_name,omitempty"`
LGAName string `json:"lga_name,omitempty"`
Address string `json:"address,omitempty"`
}
NearbyUnit represents a building unit found near a coordinate.
type PointGeometry ¶
type PointGeometry struct {
Type string `json:"type,omitempty"`
Coordinates []float64 `json:"coordinates,omitempty"` // [lng, lat]
}
PointGeometry represents GeoJSON point coordinates (L5).
type Postcode ¶
type Postcode struct {
// contains filtered or unexported fields
}
Postcode represents an immutable, validated 11-byte Nigerian postcode. Backed by a fixed byte array to ensure zero heap escapes.
func (Postcode) AppendText ¶
AppendText implements encoding.TextAppender for zero-alloc formatting. Outputs the spaced format: "AA 99 H77 BB 55".
func (Postcode) BuildingUnit ¶
func (Postcode) Coordinates ¶ added in v0.1.1
Coordinates returns the latitude and longitude coordinates for this postcode.
func (Postcode) Formatted ¶
Formatted returns the canonical hyphenated representation (e.g. "EK-01-A03-FK-01").
func (Postcode) GoogleMapsURL ¶ added in v0.1.1
GoogleMapsURL returns a direct Google Maps search URL with exact coordinates.
func (Postcode) Location ¶ added in v0.1.1
Location returns the resolved geographic location and mapping URLs for this postcode. Resolves offline via built-in administrative and building registries without network calls.
func (Postcode) MarshalText ¶
func (*Postcode) UnmarshalText ¶
type Precision ¶ added in v0.1.1
type Precision uint8
Precision indicates the resolution accuracy of the resolved coordinates.
const ( // PrecisionBuilding indicates exact building-level point geometry. PrecisionBuilding Precision = iota // PrecisionArea indicates area or street axis level resolution. PrecisionArea // PrecisionDistrict indicates district-level centroid resolution. PrecisionDistrict // PrecisionLGA indicates Local Government Area centroid resolution. PrecisionLGA // PrecisionState indicates State-level centroid resolution. PrecisionState )
func (Precision) MarshalJSON ¶ added in v0.1.1
MarshalJSON implements json.Marshaler.
func (Precision) MarshalText ¶ added in v0.1.1
MarshalText implements encoding.TextMarshaler.
func (Precision) String ¶ added in v0.1.1
String returns the human-readable description of the precision level.
func (*Precision) UnmarshalJSON ¶ added in v0.1.1
UnmarshalJSON implements json.Unmarshaler to accept both string ("building") and numeric (0) forms.
func (*Precision) UnmarshalText ¶ added in v0.1.1
UnmarshalText implements encoding.TextUnmarshaler.
type RateLimitInfo ¶
type RateLimitInfo struct {
Limit int // Maximum requests allowed in current window (from X-RateLimit-Limit)
Remaining int // Remaining requests in current window (from X-RateLimit-Remaining)
ResetAt time.Time // Timestamp when quota resets (from X-RateLimit-Reset or Retry-After)
RetryAfter time.Duration // Cooldown duration requested by server (from Retry-After or X-RateLimit-Reset)
}
RateLimitInfo contains the rate-limiting quotas returned by the NIPOST API gateway as documented in https://docs.postcode.gov.ng/authentication.
func ParseRateLimitInfo ¶
func ParseRateLimitInfo(h http.Header) *RateLimitInfo
ParseRateLimitInfo extracts rate limit quotas and cooldown durations from HTTP response headers.
type RecentHouseAddress ¶
type RecentHouseAddress struct {
Address string `json:"address,omitempty"`
Recent string `json:"recent,omitempty"`
HouseNumber string `json:"house_number,omitempty"`
StreetName string `json:"street_name,omitempty"`
LocalityName string `json:"locality_name,omitempty"`
}
RecentHouseAddress contains residential and street metadata (L2+).
type RetryConfig ¶
type RetryConfig struct {
MaxRetries int // Maximum retry attempts for transient errors (default: 3)
BaseDelay time.Duration // Initial exponential backoff delay (default: 100ms)
MaxDelay time.Duration // Maximum exponential backoff delay (default: 2s)
DisableRateLimit bool // If true, 429 Too Many Requests will not be retried automatically
MaxRateLimitDelay time.Duration // Maximum sleep duration client will wait for a 429 cooldown (default: 10s)
}
RetryConfig configures backoff, jitter, and rate-limit handling for HTTP requests.
type RetryTransport ¶
type RetryTransport struct {
Base http.RoundTripper
Config RetryConfig
}
func NewRetryTransport ¶
func NewRetryTransport(base http.RoundTripper, cfg RetryConfig) *RetryTransport
type ReverseParams ¶
type ReverseParams struct {
Latitude float64
Longitude float64
MaxDistanceM float64 // Search radius in meters (default 25, max 250)
}
ReverseParams configures reverse geocoding to snap coordinates to the nearest unit.
type ReverseResponse ¶
type ReverseResponse struct {
Found bool `json:"found"`
Coordinate []float64 `json:"coordinate"` // [lng, lat]
Unit *NearbyUnit `json:"unit,omitempty"`
Area string `json:"area,omitempty"`
District string `json:"district,omitempty"`
State string `json:"state,omitempty"`
Message string `json:"message,omitempty"`
RadiusM float64 `json:"radius_m"`
}
ReverseResponse represents the result of reverse geocoding a coordinate.
type Segments ¶
type Segments struct {
State string `json:"state"`
LGA string `json:"lga"`
District string `json:"district"`
Area string `json:"area"`
Unit string `json:"unit"`
}
Segments represents the 5 administrative components of a Nigerian postcode.
type Span ¶
type Span interface {
End()
RecordError(err error)
SetAttribute(key, value string)
SetStatus(code int, msg string)
}
Span encapsulates active span operations without coupling to any trace vendor.
type StateRecord ¶ added in v0.1.1
type StateRecord struct {
Code string
Name string
Capital string
Latitude float64
Longitude float64
Zone string
}
StateRecord holds reference coordinates and metadata for a Nigerian state.
type Telemetry ¶
type Telemetry struct {
Tracer Tracer
Metrics MetricsRecorder
}
Telemetry bundles tracing and metrics hooks.
func NopTelemetry ¶
func NopTelemetry() Telemetry
NopTelemetry provides zero-overhead, no-op telemetry by default.