neutral_types/
lib.rs

1//! # neutral_types
2//! This crate provide all necessary types to create a client of neutrinoapi.com
3//! Currently this crate is used as a dependency of [neutral](https://docs.rs/neutral/latest/neutral) and you shoud not use this crate directly.
4//!
5//! If you want to interact with neutrinoapi.com from rust, use the [neutral](https://docs.rs/neutral/latest/neutral) crate.
6
7use 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/// Describes a kind of phone number.
17#[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/// Describes a timezone from neutrinoapi.
29#[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/// Describes a network provider.
40#[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/// Desribe a neutrinoapi sensor.
54#[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}