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

1
.gitignore vendored
View file

@ -1 +1,2 @@
/target /target
Cargo.lock

View file

@ -1,9 +1,11 @@
[package] [package]
name = "locat" name = "locat"
version = "0.2.0" version = "0.3.0"
edition = "2021" edition = "2021"
publish = ["menteeth"] publish = ["menteeth"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
maxminddb = "0.23"
thiserror = "1"

View file

@ -1,17 +1,32 @@
use std::net::IpAddr; use std::net::IpAddr;
/// Allows geo-locating IPs and keeps analytics. /// 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 { impl Locat {
pub fn new(_geoip_country_db_path: &str, _analytics_db_path: &str) -> Self { pub fn new(geoip_country_db_path: &str, _analytics_db_path: &str) -> Result<Self, Error> {
// TODO: read geoip db, create analytics db // Todo: create analytics db.
Self {}
Ok(Self {
geoip: maxminddb::Reader::open_readfile(geoip_country_db_path)?,
})
} }
/// Converts an address to an ISO 3166-1 alpha-2 country code. /// Converts an address to an ISO 3166-1 alpha-2 country code.
pub fn ip_to_iso_code(&self, _addr: IpAddr) -> Option<&str> { pub fn ip_to_iso_code(&self, addr: IpAddr) -> Option<&str> {
None self.geoip
.lookup::<maxminddb::geoip2::Country>(addr)
.ok()?
.country?
.iso_code
} }
/// Returns a map of country codes to number of requests. /// Returns a map of country codes to number of requests.