Skip to main content

apollo_configuration/types/
socket.rs

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