This allows those types to be used in the section config types for the
wireguard fabric, as well as in the API definitions for them.

Signed-off-by: Stefan Hanreich <[email protected]>
---
 proxmox-network-types/src/endpoint.rs | 30 +++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/proxmox-network-types/src/endpoint.rs 
b/proxmox-network-types/src/endpoint.rs
index 24e33c7f..a6a209e2 100644
--- a/proxmox-network-types/src/endpoint.rs
+++ b/proxmox-network-types/src/endpoint.rs
@@ -7,13 +7,19 @@ use std::{
     str::FromStr,
 };
 
+#[cfg(feature = "api-types")]
+use proxmox_schema::StringSchema;
+#[cfg(feature = "api-types")]
+use proxmox_schema::{ApiType, Updater, UpdaterType};
+use serde::{Deserialize, Serialize};
 use serde_with::{DeserializeFromStr, SerializeDisplay};
 
 /// Represents either a resolvable hostname or an IPv4/IPv6 address.
 /// IPv6 address are correctly bracketed on [`Display`], and parsing
 /// automatically tries parsing it as an IP address first, falling back to a
 /// plain hostname in the other case.
-#[derive(Clone, Debug, PartialEq)]
+#[derive(Clone, Debug, PartialEq, Hash, Deserialize, Serialize)]
+#[serde(untagged)]
 pub enum HostnameOrIpAddr {
     Hostname(String),
     IpAddr(IpAddr),
@@ -42,9 +48,19 @@ impl<S: Into<String>> From<S> for HostnameOrIpAddr {
     }
 }
 
+#[cfg(feature = "api-types")]
+impl ApiType for HostnameOrIpAddr {
+    const API_SCHEMA: proxmox_schema::Schema = StringSchema::new("hostname or 
ip address").schema();
+}
+
+#[cfg(feature = "api-types")]
+impl UpdaterType for HostnameOrIpAddr {
+    type Updater = Option<Self>;
+}
+
 /// Represents a (host, port) tuple, where the host can either be a resolvable
 /// hostname or an IPv4/IPv6 address.
-#[derive(Clone, Debug, PartialEq, SerializeDisplay, DeserializeFromStr)]
+#[derive(Clone, Debug, PartialEq, Hash, SerializeDisplay, DeserializeFromStr)]
 pub struct ServiceEndpoint {
     host: HostnameOrIpAddr,
     port: u16,
@@ -99,6 +115,16 @@ impl FromStr for ServiceEndpoint {
     }
 }
 
+#[cfg(feature = "api-types")]
+impl UpdaterType for ServiceEndpoint {
+    type Updater = Option<Self>;
+}
+
+#[cfg(feature = "api-types")]
+impl ApiType for ServiceEndpoint {
+    const API_SCHEMA: proxmox_schema::Schema = StringSchema::new("service 
endpoint").schema();
+}
+
 #[cfg(test)]
 mod tests {
     use crate::endpoint::HostnameOrIpAddr;
-- 
2.47.3



Reply via email to