diff --git a/rust/operator-binary/src/controller/build/role_group_builder.rs b/rust/operator-binary/src/controller/build/role_group_builder.rs index 1de9a61..9fce8a4 100644 --- a/rust/operator-binary/src/controller/build/role_group_builder.rs +++ b/rust/operator-binary/src/controller/build/role_group_builder.rs @@ -62,6 +62,7 @@ use crate::{ }, role_group_utils::ResourceNames, types::{ + common::Port, kubernetes::{ PersistentVolumeClaimName, SecretClassName, ServiceAccountName, ServiceName, VolumeName, @@ -72,9 +73,9 @@ use crate::{ }; pub const HTTP_PORT_NAME: &str = "http"; -pub const HTTP_PORT: u16 = 9200; +pub const HTTP_PORT: Port = Port(9200); pub const TRANSPORT_PORT_NAME: &str = "transport"; -pub const TRANSPORT_PORT: u16 = 9300; +pub const TRANSPORT_PORT: Port = Port(9300); constant!(CONFIG_VOLUME_NAME: VolumeName = "config"); diff --git a/rust/operator-binary/src/framework/types.rs b/rust/operator-binary/src/framework/types.rs index fb75cd3..65f6116 100644 --- a/rust/operator-binary/src/framework/types.rs +++ b/rust/operator-binary/src/framework/types.rs @@ -1,2 +1,3 @@ +pub mod common; pub mod kubernetes; pub mod operator; diff --git a/rust/operator-binary/src/framework/types/common.rs b/rust/operator-binary/src/framework/types/common.rs new file mode 100644 index 0000000..3d7326e --- /dev/null +++ b/rust/operator-binary/src/framework/types/common.rs @@ -0,0 +1,68 @@ +//! Common types that do not belong (yet) to a more specific module +use snafu::{ResultExt, Snafu}; +use strum::{EnumDiscriminants, IntoStaticStr}; + +#[derive(Snafu, Debug, EnumDiscriminants)] +#[strum_discriminants(derive(IntoStaticStr))] +pub enum Error { + #[snafu(display("failed to convert to port number"))] + ConvertToPortNumber { source: std::num::TryFromIntError }, +} + +/// A port number +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Port(pub u16); + +impl std::fmt::Display for Port { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl From for Port { + fn from(value: u16) -> Self { + Port(value) + } +} + +impl From for i32 { + fn from(value: Port) -> Self { + value.0 as i32 + } +} + +impl TryFrom for Port { + type Error = Error; + + fn try_from(value: i32) -> Result { + Ok(Port( + u16::try_from(value).context(ConvertToPortNumberSnafu)?, + )) + } +} + +#[cfg(test)] +mod tests { + + use super::{ErrorDiscriminants, Port}; + + #[test] + fn test_port_fmt() { + assert_eq!("0".to_owned(), Port(0).to_string()); + assert_eq!("65535".to_owned(), Port(65535).to_string()); + } + + #[test] + fn test_port_try_from_i32() { + assert_eq!(Some(Port(0)), Port::try_from(0).ok()); + assert_eq!(Some(Port(65535)), Port::try_from(65535).ok()); + assert_eq!( + Err(ErrorDiscriminants::ConvertToPortNumber), + Port::try_from(-1).map_err(ErrorDiscriminants::from) + ); + assert_eq!( + Err(ErrorDiscriminants::ConvertToPortNumber), + Port::try_from(65536).map_err(ErrorDiscriminants::from) + ); + } +}