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