Use MaxMindDb and thiserror.

This commit is contained in:
Lyle Mantooth 2023-05-20 11:50:57 -04:00
parent c05d9a68f4
commit 83381e4933
Signed by: IslandUsurper
GPG key ID: 6DB52EAE123A5789
3 changed files with 25 additions and 7 deletions

View file

@ -1,17 +1,32 @@
use std::net::IpAddr;
/// Allows geo-locating IPs and keeps analytics.
pub struct Locat {}
pub struct Locat {
geoip: maxminddb::Reader<Vec<u8>>,
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("maxminddb error: {0}")]
MaxMindDb(#[from] maxminddb::MaxMindDBError),
}
impl Locat {
pub fn new(_geoip_country_db_path: &str, _analytics_db_path: &str) -> Self {
// TODO: read geoip db, create analytics db
Self {}
pub fn new(geoip_country_db_path: &str, _analytics_db_path: &str) -> Result<Self, Error> {
// Todo: create analytics db.
Ok(Self {
geoip: maxminddb::Reader::open_readfile(geoip_country_db_path)?,
})
}
/// Converts an address to an ISO 3166-1 alpha-2 country code.
pub fn ip_to_iso_code(&self, _addr: IpAddr) -> Option<&str> {
None
pub fn ip_to_iso_code(&self, addr: IpAddr) -> Option<&str> {
self.geoip
.lookup::<maxminddb::geoip2::Country>(addr)
.ok()?
.country?
.iso_code
}
/// Returns a map of country codes to number of requests.