0.27.0
·
35 commits
to greg/release
since this release
Immutable
release. Only release title and notes can be modified.
This release includes significant API changes. See UPGRADING.md
for migration guidance.
Breaking Changes
Lookup API
lookup()now returnsLookupResultinstead ofOption<T>. The new API
enables lazy decoding - data is only deserialized when explicitly requested.lookup_prefix()has been removed. Uselookup(ip)?.network()instead.
Iteration API
within()now requires a secondWithinOptionsparameter. Use
Default::default()for the previous behavior.Withiniterator now yieldsLookupResultinstead ofWithinItem<T>.
GeoIP2 Structs
- The
namesfields now use aNamesstruct instead ofBTreeMap<&str, &str>.
Access names directly via language fields (e.g.,names.english). - Nested struct fields (
city,country,location, etc.) are now
non-optional withDefault, simplifying access patterns. - Removed
is_anonymous_proxyandis_satellite_providerfromTraits.
These fields are no longer present in MaxMind databases.
Error Types
InvalidDatabaseandDecodingvariants now use structured fields instead
of a single string. Pattern matching must be updated.- New
InvalidInputvariant for user input errors (e.g., IPv6 lookup in
IPv4-only database).
Memory Mapping
Reader::open_mmapis nowunsafe. The caller must ensure the database
file is not modified or truncated while theReaderexists. This fixes a
soundness issue. Reported by paolobarbolini. GitHub #86.
Added
LookupResulttype with lazy decoding support:has_data()- Check if data exists for this IPnetwork()- Get the network containing the IPoffset()- Get data offset for caching/deduplicationdecode()- Deserialize full recorddecode_path()- Selectively decode specific fields by path
PathElementenum andpath!macro for navigating nested structures.WithinOptionsto control network iteration behavior:include_aliased_networks()- Include IPv4 via IPv6 aliasesinclude_networks_without_data()- Include networks without data recordsskip_empty_values()- Skip empty maps/arrays
networks()method for iterating over all networks in the database.verify()method for comprehensive database validation.Metadata::build_time()to convertbuild_epochtoSystemTime.PartialEqandEqimplementations forMetadataandWithinOptions.
Changed
- Error messages now include byte offsets when available.
decode_path()errors include path context showing where navigation failed.- Added recursion depth limit (512) matching libmaxminddb and Go reader.
- Serde deserializer improvements: size hints,
is_human_readable()returns
false,deserialize_ignored_any, anddeserialize_enumsupport. MaxMindDbErroris now#[non_exhaustive].