diff --git a/Cargo.toml b/Cargo.toml index 8c2d62a7..7c99ea21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ edition = "2021" default = [] mmap = ["memmap2"] unsafe-str-decode = [] +schema = ["schemars"] [lib] name ="maxminddb" @@ -28,6 +29,7 @@ log = "0.4" serde = { version = "1.0", features = ["derive"] } memchr = "2.4" memmap2 = { version = "0.9.0", optional = true } +schemars = { version = "0.8.16",optional = true } [dev-dependencies] env_logger = "0.10" diff --git a/src/maxminddb/geoip2.rs b/src/maxminddb/geoip2.rs index 03123aa8..a2544f5e 100644 --- a/src/maxminddb/geoip2.rs +++ b/src/maxminddb/geoip2.rs @@ -1,7 +1,10 @@ +#[cfg(feature = "schema")] +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; /// GeoIP2 Country record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Country<'a> { #[serde(borrow)] pub continent: Option>, @@ -13,6 +16,7 @@ pub struct Country<'a> { /// GeoIP2 City record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct City<'a> { #[serde(borrow)] pub city: Option>, @@ -28,6 +32,7 @@ pub struct City<'a> { /// GeoIP2 Enterprise record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Enterprise<'a> { #[serde(borrow)] pub city: Option>, @@ -43,6 +48,7 @@ pub struct Enterprise<'a> { /// GeoIP2 ISP record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Isp<'a> { pub autonomous_system_number: Option, pub autonomous_system_organization: Option<&'a str>, @@ -54,12 +60,14 @@ pub struct Isp<'a> { /// GeoIP2 Connection-Type record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct ConnectionType<'a> { pub connection_type: Option<&'a str>, } /// GeoIP2 Anonymous Ip record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct AnonymousIp { pub is_anonymous: Option, pub is_anonymous_vpn: Option, @@ -71,6 +79,7 @@ pub struct AnonymousIp { /// GeoIP2 DensityIncome record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct DensityIncome { pub average_income: Option, pub population_density: Option, @@ -78,12 +87,14 @@ pub struct DensityIncome { /// GeoIP2 Domain record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Domain<'a> { pub domain: Option<&'a str>, } /// GeoIP2 Asn record #[derive(Deserialize, Serialize, Clone, Debug)] +#[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Asn<'a> { pub autonomous_system_number: Option, pub autonomous_system_organization: Option<&'a str>, @@ -91,10 +102,13 @@ pub struct Asn<'a> { /// Country model structs pub mod country { + #[cfg(feature = "schema")] + use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Continent<'a> { pub code: Option<&'a str>, pub geoname_id: Option, @@ -102,6 +116,7 @@ pub mod country { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Country<'a> { pub geoname_id: Option, pub is_in_european_union: Option, @@ -110,6 +125,7 @@ pub mod country { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct RepresentedCountry<'a> { pub geoname_id: Option, pub is_in_european_union: Option, @@ -120,6 +136,7 @@ pub mod country { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Traits { pub is_anonymous_proxy: Option, pub is_satellite_provider: Option, @@ -128,12 +145,15 @@ pub mod country { /// Country model structs pub mod city { + #[cfg(feature = "schema")] + use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; pub use super::country::{Continent, Country, RepresentedCountry, Traits}; #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct City<'a> { pub geoname_id: Option, #[serde(borrow)] @@ -141,6 +161,7 @@ pub mod city { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Location<'a> { pub accuracy_radius: Option, pub latitude: Option, @@ -150,11 +171,13 @@ pub mod city { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Postal<'a> { pub code: Option<&'a str>, } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Subdivision<'a> { pub geoname_id: Option, pub iso_code: Option<&'a str>, @@ -164,12 +187,15 @@ pub mod city { /// Enterprise model structs pub mod enterprise { + #[cfg(feature = "schema")] + use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; pub use super::country::{Continent, RepresentedCountry}; #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct City<'a> { pub confidence: Option, pub geoname_id: Option, @@ -178,6 +204,7 @@ pub mod enterprise { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Country<'a> { pub confidence: Option, pub geoname_id: Option, @@ -187,6 +214,7 @@ pub mod enterprise { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Location<'a> { pub accuracy_radius: Option, pub latitude: Option, @@ -196,12 +224,14 @@ pub mod enterprise { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Postal<'a> { pub code: Option<&'a str>, pub confidence: Option, } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Subdivision<'a> { pub confidence: Option, pub geoname_id: Option, @@ -210,6 +240,7 @@ pub mod enterprise { } #[derive(Deserialize, Serialize, Clone, Debug)] + #[cfg_attr(feature = "schema", derive(JsonSchema))] pub struct Traits<'a> { pub autonomous_system_number: Option, pub autonomous_system_organization: Option<&'a str>,