Skip to main content

rdap_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 crate::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#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct IpResponse {
22    /// The original query string (IP address).
23    pub query: String,
24
25    /// Registry handle.
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub handle: Option<String>,
28
29    /// First address in the CIDR block.
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub start_address: Option<String>,
32
33    /// Last address in the CIDR block.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub end_address: Option<String>,
36
37    /// IP version of the network block.
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub ip_version: Option<IpVersion>,
40
41    /// Human-readable name of the allocation (e.g., "GOOGLE").
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub name: Option<String>,
44
45    /// Allocation type (e.g., "DIRECT ALLOCATION").
46    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
47    pub allocation_type: Option<String>,
48
49    /// ISO 3166-1 alpha-2 country code.
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub country: Option<String>,
52
53    /// Parent network handle (for sub-allocations).
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub parent_handle: Option<String>,
56
57    #[serde(default, skip_serializing_if = "Vec::is_empty")]
58    pub status: Vec<RdapStatus>,
59
60    #[serde(default, skip_serializing_if = "Vec::is_empty")]
61    pub entities: Vec<RdapEntity>,
62
63    #[serde(default, skip_serializing_if = "Vec::is_empty")]
64    pub events: Vec<RdapEvent>,
65
66    #[serde(default, skip_serializing_if = "Vec::is_empty")]
67    pub links: Vec<RdapLink>,
68
69    #[serde(default, skip_serializing_if = "Vec::is_empty")]
70    pub remarks: Vec<RdapRemark>,
71
72    pub meta: ResponseMeta,
73}