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
Cargo.lock

View file

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

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.