Skip to main content

rdapify/types/
ip.rs

1//! Normalised RDAP IP network response type.
2//!
3//! Follows RFC 9083 ยง5.4 (IP Network Object Class).
4
5use serde::{Deserialize, Serialize};
6
7use super::common::{RdapEntity, RdapEvent, RdapLink, RdapRemark, RdapStatus, ResponseMeta};
8
9/// IP protocol version.
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11pub enum IpVersion {
12    #[serde(rename = "v4")]
13    V4,
14    #[serde(rename = "v6")]
15    V6,
16}
17
18/// Normalised RDAP response for an IP address query.
19///
20/// # Example
21/// ```rust,no_run
22/// # use rdapify::RdapClient;
23/// # #[tokio::main] async fn main() -> rdapify::error::Result<()> {
24/// let client = RdapClient::new()?;
25/// let res = client.ip("8.8.8.8").await?;
26/// println!("Country: {:?}", res.country);
27/// # Ok(()) }
28/// ```
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(rename_all = "camelCase")]
31pub struct IpResponse {
32    /// The original query string (IP address).
33    pub query: String,
34
35    /// Registry handle.
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub handle: Option<String>,
38
39    /// First address in the CIDR block.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub start_address: Option<String>,
42
43    /// Last address in the CIDR block.
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub end_address: Option<String>,
46
47    /// IP version of the network block.
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub ip_version: Option<IpVersion>,
50
51    /// Human-readable name of the allocation (e.g., "GOOGLE").
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub name: Option<String>,
54
55    /// Allocation type (e.g., "DIRECT ALLOCATION").
56    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
57    pub allocation_type: Option<String>,
58
59    /// ISO 3166-1 alpha-2 country code.
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub country: Option<String>,
62
63    /// Parent network handle (for sub-allocations).
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub parent_handle: Option<String>,
66
67    #[serde(default, skip_serializing_if = "Vec::is_empty")]
68    pub status: Vec<RdapStatus>,
69
70    #[serde(default, skip_serializing_if = "Vec::is_empty")]
71    pub entities: Vec<RdapEntity>,
72
73    #[serde(default, skip_serializing_if = "Vec::is_empty")]
74    pub events: Vec<RdapEvent>,
75
76    #[serde(default, skip_serializing_if = "Vec::is_empty")]
77    pub links: Vec<RdapLink>,
78
79    #[serde(default, skip_serializing_if = "Vec::is_empty")]
80    pub remarks: Vec<RdapRemark>,
81
82    pub meta: ResponseMeta,
83}