1use serde::{Deserialize, Deserializer, Serialize};
8
9pub mod error;
10pub mod hlr_lookup;
11pub mod ip_blocklist;
12pub mod ip_info;
13pub mod ip_probe;
14pub mod phone_validate;
15
16#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
18#[serde(rename_all(deserialize = "kebab-case", serialize = "kebab-case"))]
19pub enum PhoneInfoKind {
20 Mobile,
21 FixedLine,
22 PremiumRate,
23 TollFree,
24 Voip,
25 Unknown,
26}
27
28#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
30pub struct NeutrinoTimeZoneResponse {
31 pub id: String,
32 pub name: String,
33 pub abbr: String,
34 pub date: String,
35 pub time: String,
36 pub offset: String,
37}
38
39#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
41#[serde(rename_all(deserialize = "snake_case", serialize = "snake_case"))]
42pub enum NeutrinoProviderKind {
43 Isp,
44 Hosting,
45 Vpn,
46 Proxy,
47 University,
48 Government,
49 Commercial,
50 Unknown,
51}
52
53#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
55pub struct NeutrinoSensor {
56 pub id: usize,
57 pub blocklist: String,
58 pub description: String,
59}
60
61pub(crate) fn object_empty_as_none<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
62where
63 D: Deserializer<'de>,
64 for<'a> T: Deserialize<'a>,
65{
66 #[derive(Deserialize, Debug)]
67 #[serde(deny_unknown_fields)]
68 struct Empty {}
69
70 #[derive(Deserialize, Debug)]
71 #[serde(untagged)]
72 enum Aux<T> {
73 T(T),
74 Empty(Empty),
75 Null,
76 }
77
78 match Deserialize::deserialize(deserializer)? {
79 Aux::T(t) => Ok(Some(t)),
80 Aux::Empty(_) | Aux::Null => Ok(None),
81 }
82}