Use MaxMindDb and thiserror.
This commit is contained in:
parent
c05d9a68f4
commit
83381e4933
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
||||||
/target
|
/target
|
||||||
|
Cargo.lock
|
||||||
|
|
|
@ -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"
|
||||||
|
|
27
src/lib.rs
27
src/lib.rs
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue