1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use serde::Serialize;
use serde_with::skip_serializing_none;

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

#[skip_serializing_none]
#[derive(PartialEq, Debug, Clone, Serialize)]
pub struct Record {
    pub ip: String,
    pub latitude: Option<f32>,
    pub longitude: Option<f32>,
    pub country: Option<Country>,
    pub region: Option<String>,
    pub city: Option<String>,
    pub isp: Option<String>,
    pub domain: Option<String>,
    pub zip_code: Option<String>,
    pub time_zone: Option<String>,
    pub net_speed: Option<String>,
    pub idd_code: Option<String>,
    pub area_code: Option<String>,
    pub weather_station_code: Option<String>,
    pub weather_station_name: Option<String>,
    pub mcc: Option<String>,
    pub mnc: Option<String>,
    pub mobile_brand: Option<String>,
    pub elevation: Option<String>,
    pub usage_type: Option<String>,
}

impl Record {
    pub fn new_empty() -> Self {
        Self {
            ip: "".to_string(),
            latitude: None,
            longitude: None,
            country: None,
            region: None,
            city: None,
            isp: None,
            domain: None,
            zip_code: None,
            time_zone: None,
            net_speed: None,
            idd_code: None,
            area_code: None,
            weather_station_code: None,
            weather_station_name: None,
            mcc: None,
            mnc: None,
            mobile_brand: None,
            elevation: None,
            usage_type: None,
        }
    }

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