ip2location 0.3.5

Find geo information & proxy information based on the given IP using IP2Location BIN databases
Documentation
#![allow(clippy::enum_variant_names, clippy::derive_partial_eq_without_eq)]

use serde::Serialize;
use serde_with::skip_serializing_none;
use std::net::{IpAddr, Ipv6Addr};

#[derive(PartialEq, Debug, Clone, Serialize)]
pub struct Country {
    pub short_name: String,
    pub long_name: String,
}

#[derive(PartialEq, Debug, Clone, Serialize)]
pub enum Proxy {
    IsAnError,
    IsNotAProxy,
    IsAProxy,
    IsADataCenterIpAddress,
}

#[skip_serializing_none]
#[derive(PartialEq, Debug, Clone, Serialize)]
pub struct ProxyRecord {
    pub ip: IpAddr,
    pub country: Option<Country>,
    pub region: Option<String>,
    pub city: Option<String>,
    pub isp: Option<String>,
    pub domain: Option<String>,
    pub is_proxy: Option<Proxy>,
    pub proxy_type: Option<String>,
    pub asn: Option<String>,
    pub as_: Option<String>,
    pub last_seen: Option<String>,
    pub threat: Option<String>,
    pub provider: Option<String>,
    pub usage_type: Option<String>,
}

impl ProxyRecord {
    pub fn to_json(&self) -> String {
        serde_json::to_string(&self).unwrap()
    }
}

impl Default for ProxyRecord {
    fn default() -> Self {
        ProxyRecord {
            ip: IpAddr::V6(Ipv6Addr::UNSPECIFIED),
            country: None,
            region: None,
            city: None,
            isp: None,
            domain: None,
            is_proxy: Some(Proxy::IsAnError),
            proxy_type: None,
            asn: None,
            as_: None,
            last_seen: None,
            threat: None,
            provider: None,
            usage_type: None,
        }
    }
}