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
