diff --git a/shared/grpc_clients/src/error.rs b/shared/grpc_clients/src/error.rs --- a/shared/grpc_clients/src/error.rs +++ b/shared/grpc_clients/src/error.rs @@ -4,10 +4,12 @@ Debug, derive_more::Display, derive_more::From, derive_more::Error, )] pub enum Error { - #[display(...)] + #[display(fmt = "Transport Error: {:?}", _0)] TransportError(tonic::transport::Error), - #[display(...)] + #[display(fmt = "Invalid Uri: {:?}", _0)] InvalidUri(InvalidUri), - #[display(...)] + #[display(fmt = "Grpc Status: {:?}", _0)] GrpcStatus(Status), + #[display(fmt = "Invalid Device Type")] + InvalidDeviceType, } diff --git a/shared/grpc_clients/src/identity/device.rs b/shared/grpc_clients/src/identity/device.rs new file mode 100644 --- /dev/null +++ b/shared/grpc_clients/src/identity/device.rs @@ -0,0 +1,57 @@ +use std::fmt::{Display, Formatter, Result as FmtResult}; + +use crate::error::Error; +pub use crate::identity::protos::client::DeviceType; + +impl TryFrom for DeviceType { + type Error = crate::error::Error; + + fn try_from(value: i32) -> Result { + match value { + 0 => Ok(DeviceType::Keyserver), + 1 => Ok(DeviceType::Web), + 2 => Ok(DeviceType::Ios), + 3 => Ok(DeviceType::Android), + 4 => Ok(DeviceType::Windows), + 5 => Ok(DeviceType::MacOs), + _ => Err(Error::InvalidDeviceType), + } + } +} + +impl Display for DeviceType { + fn fmt(&self, f: &mut Formatter) -> FmtResult { + match self { + DeviceType::Keyserver => write!(f, "keyserver"), + DeviceType::Web => write!(f, "web"), + DeviceType::Ios => write!(f, "ios"), + DeviceType::Android => write!(f, "android"), + DeviceType::Windows => write!(f, "windows"), + DeviceType::MacOs => write!(f, "macos"), + } + } +} + +#[cfg(test)] +mod device_tests { + use super::*; + + #[test] + fn test_device_try_from() { + let device_type = DeviceType::try_from(5i32).unwrap(); + + assert_eq!(DeviceType::MacOs, device_type); + } + + #[test] + fn test_invalid_device() { + let device_type_result = DeviceType::try_from(6i32); + + assert!(device_type_result.is_err()); + } + + #[test] + fn test_display_device_type() { + assert_eq!(format!("{}", DeviceType::Ios), "ios"); + } +} diff --git a/shared/grpc_clients/src/identity/mod.rs b/shared/grpc_clients/src/identity/mod.rs --- a/shared/grpc_clients/src/identity/mod.rs +++ b/shared/grpc_clients/src/identity/mod.rs @@ -1,4 +1,5 @@ pub mod authenticated; +pub mod device; pub mod unauthenticated; pub mod protos { @@ -14,4 +15,5 @@ } pub use authenticated::get_auth_client; +pub use device::DeviceType; pub use unauthenticated::get_unauthenticated_client;