diff --git a/shared/grpc_clients/src/error.rs b/shared/grpc_clients/src/error.rs index b7dd26ed2..ea387d89a 100644 --- a/shared/grpc_clients/src/error.rs +++ b/shared/grpc_clients/src/error.rs @@ -1,13 +1,15 @@ use tonic::{codegen::http::uri::InvalidUri, Status}; #[derive( 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 index 000000000..01497f22f --- /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 index 398a96d8d..4bffc3d68 100644 --- a/shared/grpc_clients/src/identity/mod.rs +++ b/shared/grpc_clients/src/identity/mod.rs @@ -1,17 +1,19 @@ pub mod authenticated; +pub mod device; pub mod unauthenticated; pub mod protos { // This must be named client for authenticated generated code pub mod client { tonic::include_proto!("identity.client"); } pub use client as unauthenticated; pub mod authenticated { tonic::include_proto!("identity.authenticated"); } } pub use authenticated::get_auth_client; +pub use device::DeviceType; pub use unauthenticated::get_unauthenticated_client;