Skip to main content

apollo_configuration/types/
ip.rs

1//! Support for IP address types in configuration.
2
3use std::borrow::Cow;
4
5use derive_more::{Deref, Display, From, FromStr};
6use schemars::JsonSchema;
7use serde::de::Deserializer;
8use serde::{Deserialize, Serialize};
9
10use crate::Validate;
11
12// =============================================================================
13// IpAddr
14// =============================================================================
15
16/// An IP address (v4 or v6) parsed from configuration.
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deref, From, FromStr, Display)]
18pub struct IpAddr(std::net::IpAddr);
19
20impl<'de> Deserialize<'de> for IpAddr {
21    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
22    where
23        D: Deserializer<'de>,
24    {
25        let s = String::deserialize(deserializer)?;
26        s.parse().map_err(serde::de::Error::custom)
27    }
28}
29
30impl Serialize for IpAddr {
31    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: serde::Serializer,
34    {
35        self.0.to_string().serialize(serializer)
36    }
37}
38
39impl JsonSchema for IpAddr {
40    fn schema_name() -> Cow<'static, str> {
41        Cow::Borrowed("IpAddr")
42    }
43
44    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
45        std::net::IpAddr::json_schema(generator)
46    }
47}
48
49impl Validate for IpAddr {}
50
51// =============================================================================
52// Ipv4Addr
53// =============================================================================
54
55/// An IPv4 address parsed from configuration.
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deref, From, FromStr, Display)]
57pub struct Ipv4Addr(std::net::Ipv4Addr);
58
59impl<'de> Deserialize<'de> for Ipv4Addr {
60    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
61    where
62        D: Deserializer<'de>,
63    {
64        let s = String::deserialize(deserializer)?;
65        s.parse().map_err(serde::de::Error::custom)
66    }
67}
68
69impl Serialize for Ipv4Addr {
70    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
71    where
72        S: serde::Serializer,
73    {
74        self.0.to_string().serialize(serializer)
75    }
76}
77
78impl JsonSchema for Ipv4Addr {
79    fn schema_name() -> Cow<'static, str> {
80        Cow::Borrowed("Ipv4Addr")
81    }
82
83    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
84        std::net::Ipv4Addr::json_schema(generator)
85    }
86}
87
88impl Validate for Ipv4Addr {}
89
90// =============================================================================
91// Ipv6Addr
92// =============================================================================
93
94/// An IPv6 address parsed from configuration.
95#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deref, From, FromStr, Display)]
96pub struct Ipv6Addr(std::net::Ipv6Addr);
97
98impl<'de> Deserialize<'de> for Ipv6Addr {
99    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
100    where
101        D: Deserializer<'de>,
102    {
103        let s = String::deserialize(deserializer)?;
104        s.parse().map_err(serde::de::Error::custom)
105    }
106}
107
108impl Serialize for Ipv6Addr {
109    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
110    where
111        S: serde::Serializer,
112    {
113        self.0.to_string().serialize(serializer)
114    }
115}
116
117impl JsonSchema for Ipv6Addr {
118    fn schema_name() -> Cow<'static, str> {
119        Cow::Borrowed("Ipv6Addr")
120    }
121
122    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
123        std::net::Ipv6Addr::json_schema(generator)
124    }
125}
126
127impl Validate for Ipv6Addr {}