diff --git a/zrpc-derive/examples/simplified.rs b/zrpc-derive/examples/simplified.rs index 81a9e61..bd9ad2c 100644 --- a/zrpc-derive/examples/simplified.rs +++ b/zrpc-derive/examples/simplified.rs @@ -70,7 +70,7 @@ impl Hello for MyServer { } async fn sub(&self, _request: Request) -> Result, Status> { - Err(Status::new(Code::NotImplemented, "Not yet!")) + Err(Status::not_implemented("Not yet!")) } } @@ -124,8 +124,8 @@ where } _ => { - // Box::pin(async move { Err(Status::new(Code::Unavailable, "Unavailable")) }) - Err(Status::new(Code::Unavailable, "Unavailable")) + // Box::pin(async move { Err(Status::unavailable "Unavailable")) }) + Err(Status::unavailable("Unavailable")) } } } @@ -353,10 +353,7 @@ impl<'a> HelloClient<'a> { .res() .await .map_err(|e| { - Status::new( - Code::Unavailable, - format!("Unable to perform liveliness query: {e:?}"), - ) + Status::unavailable(format!("Unable to perform liveliness query: {e:?}")) })?; let ids = res @@ -364,9 +361,7 @@ impl<'a> HelloClient<'a> { .map(|e| { self.extract_id_from_ke( &e.sample - .map_err(|_| { - Status::new(Code::Unavailable, "Cannot get value from sample") - })? + .map_err(|_| Status::unavailable("Cannot get value from sample"))? .key_expr, ) }) @@ -382,38 +377,26 @@ impl<'a> HelloClient<'a> { .map(|m| m.id) .collect(); - ids.pop() - .ok_or(Status::new(Code::Unavailable, "No servers found")) + ids.pop().ok_or(Status::unavailable("No servers found")) } fn extract_id_from_ke(&self, ke: &KeyExpr) -> Result { let id_str = self .ke_format .parse(ke) - .map_err(|e| { - Status::new( - Code::InternalError, - format!("Unable to parse key expression: {e:?}"), - ) - })? + .map_err(|e| Status::internal_error(format!("Unable to parse key expression: {e:?}")))? .get("zid") .map_err(|e| { - Status::new( - Code::InternalError, - format!("Unable to get server id from key expression: {e:?}"), - ) + Status::internal_error(format!( + "Unable to get server id from key expression: {e:?}" + )) })? - .ok_or(Status::new( - Code::Unavailable, + .ok_or(Status::unavailable( "Unable to get server id from key expression: Option is None", ))?; - ZenohId::from_str(id_str).map_err(|e| { - Status::new( - Code::InternalError, - format!("Unable to convert str to ZenohId: {e:?}"), - ) - }) + ZenohId::from_str(id_str) + .map_err(|e| Status::internal_error(format!("Unable to convert str to ZenohId: {e:?}"))) } } diff --git a/zrpc-derive/src/lib.rs b/zrpc-derive/src/lib.rs index 9ad02f4..4063098 100644 --- a/zrpc-derive/src/lib.rs +++ b/zrpc-derive/src/lib.rs @@ -320,7 +320,7 @@ impl<'a> ServiceGenerator<'a> { } } )* - _ => Err(zrpc::prelude::Status::new(zrpc::prelude::Code::Unavailable, "Unavailable")), + _ => Err(zrpc::prelude::Status::unavailable("Unavailable")), } } @@ -543,10 +543,7 @@ impl<'a> ServiceGenerator<'a> { .res() .await .map_err(|e| { - zrpc::prelude::Status::new( - zrpc::prelude::Code::Unavailable, - format!("Unable to perform liveliness query: {e:?}"), - ) + zrpc::prelude::Status::unavailable(format!("Unable to perform liveliness query: {e:?}")) })?;(); let ids = res @@ -554,12 +551,7 @@ impl<'a> ServiceGenerator<'a> { .map(|e| { self.extract_id_from_ke( &e.sample - .map_err(|_| { - zrpc::prelude::Status::new( - zrpc::prelude::Code::Unavailable, - format!("Cannot get value from sample"), - ) - })? + .map_err(|_| zrpc::prelude::Status::unavailable("Cannot get value from sample"))? .key_expr, ) }) @@ -574,7 +566,7 @@ impl<'a> ServiceGenerator<'a> { .collect(); ids.pop() - .ok_or(Status::new(Code::Unavailable, "No servers found")) + .ok_or(zrpc::prelude::Status::unavailable("No servers found")) } fn extract_id_from_ke(&self, ke: &zenoh::key_expr::KeyExpr) -> std::result::Result { @@ -582,30 +574,14 @@ impl<'a> ServiceGenerator<'a> { let id_str = self .ke_format .parse(ke) - .map_err(|e| { - zrpc::prelude::Status::new( - zrpc::prelude::Code::InternalError, - format!("Unable to parse key expression: {e:?}"), - ) - })? + .map_err(|e| zrpc::prelude::Status::internal_error(format!("Unable to parse key expression: {e:?}")))? .get("zid") - .map_err(|e| { - zrpc::prelude::Status::new( - zrpc::prelude::Code::InternalError, - format!("Unable to get server id from key expression: {e:?}"), - ) - })? - .ok_or(zrpc::prelude::Status::new( - zrpc::prelude::Code::Unavailable, - "Unable to get server id from key expression: Option is None", - ))?; - - zenoh::prelude::ZenohId::from_str(id_str).map_err(|e| { - zrpc::prelude::Status::new( - zrpc::prelude::Code::InternalError, - format!("Unable to convert str to ZenohId: {e:?}"), - ) - }) + .map_err(|e| zrpc::prelude::Status::internal_error(format!("Unable to get server id from key expression: {e:?}")))? + .ok_or(zrpc::prelude::Status::unavailable( "Unable to get server id from key expression: Option is None"))?; + + zenoh::prelude::ZenohId::from_str(id_str) + .map_err(|e| zrpc::prelude::Status::internal_error(format!("Unable to convert str to ZenohId: {e:?}"))) + } } } diff --git a/zrpc/src/server.rs b/zrpc/src/server.rs index 6276360..e73db35 100644 --- a/zrpc/src/server.rs +++ b/zrpc/src/server.rs @@ -132,9 +132,10 @@ impl Server { self.tokens.lock().await.extend(tokens); loop { - let query = queryable.recv_async().await.map_err(|e| { - Status::new(Code::InternalError, format!("Cannot receive query: {e:?}")) - })?; + let query = queryable + .recv_async() + .await + .map_err(|e| Status::internal_error(format!("Cannot receive query: {e:?}")))?; // the query for RPC is is in the format: @rpc//service// // everything is sent as payload of the query @@ -207,12 +208,11 @@ impl Server { log::trace!("Service response: {msg:?}"); let wmsg = WireMessage { payload: Some(msg.body), - status: Status::new(Code::Ok, ""), + status: Status::ok(""), }; - serialize(&wmsg).map_err(|e| { - Status::new(Code::InternalError, format!("Serialization error: {e:?}")) - }) + serialize(&wmsg) + .map_err(|e| Status::internal_error(format!("Serialization error: {e:?}"))) } Err(e) => { log::trace!("Service error is : {e:?}"); @@ -220,9 +220,8 @@ impl Server { payload: None, status: e, }; - serialize(&wmsg).map_err(|e| { - Status::new(Code::InternalError, format!("Serialization error: {e:?}")) - }) + serialize(&wmsg) + .map_err(|e| Status::internal_error(format!("Serialization error: {e:?}"))) } } } @@ -230,26 +229,25 @@ impl Server { async fn server_metadata(labels: HashSet, id: ZenohId) -> Result, Status> { let metadata = ServerMetadata { labels, id }; let serialized_metadata = serialize(&metadata) - .map_err(|e| Status::new(Code::InternalError, format!("Serialization error: {e:?}")))?; + .map_err(|e| Status::internal_error(format!("Serialization error: {e:?}")))?; let wmsg = WireMessage { payload: Some(serialized_metadata), - status: Status::new(Code::Ok, ""), + status: Status::ok(""), }; - serialize(&wmsg) - .map_err(|e| Status::new(Code::InternalError, format!("Serialization error: {e:?}"))) + serialize(&wmsg).map_err(|e| Status::internal_error(format!("Serialization error: {e:?}"))) } async fn create_error() -> Result, Status> { - Err(Status::new(Code::Unavailable, "Unavailable")) + Err(Status::unavailable("Unavailable")) } fn get_service_name<'a>(ke: &'a KeyExpr) -> Result<&'a str, Status> { - Self::get_token(ke, 3).ok_or(Status::new(Code::InternalError, "Cannot get service name")) + Self::get_token(ke, 3).ok_or(Status::internal_error("Cannot get service name")) } fn get_method_name<'a>(ke: &'a KeyExpr) -> Result<&'a str, Status> { - Self::get_token(ke, 4).ok_or(Status::new(Code::InternalError, "Cannot get method name")) + Self::get_token(ke, 4).ok_or(Status::internal_error("Cannot get method name")) } fn get_token<'a>(ke: &'a KeyExpr, index: usize) -> Option<&'a str> { diff --git a/zrpc/src/status.rs b/zrpc/src/status.rs index 9e2cc61..521b85e 100644 --- a/zrpc/src/status.rs +++ b/zrpc/src/status.rs @@ -27,6 +27,76 @@ impl Status { pub fn message(&self) -> &String { &self.message } + + pub fn ok(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::Ok, message) + } + + pub fn created(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::Created, message) + } + + pub fn bad_request(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::BadRequest, message) + } + + pub fn unauthorized(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::Unauthorized, message) + } + + pub fn forbidden(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::Forbidden, message) + } + + pub fn not_found(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::NotFound, message) + } + + pub fn timeout(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::Timeout, message) + } + + pub fn internal_error(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::InternalError, message) + } + + pub fn not_implemented(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::NotImplemented, message) + } + + pub fn unavailable(message: IntoString) -> Self + where + IntoString: Into, + { + Self::new(Code::Unavailable, message) + } } /// Zenoh-RPC status codes diff --git a/zrpc/src/types.rs b/zrpc/src/types.rs index 2769076..0e9f120 100644 --- a/zrpc/src/types.rs +++ b/zrpc/src/types.rs @@ -11,12 +11,7 @@ * ZettaScale Zenoh Team, *********************************************************************************/ -use crate::{ - request::Request, - response::Response, - serialize::serialize, - status::{Code, Status}, -}; +use crate::{request::Request, response::Response, serialize::serialize, status::Status}; use futures::Future; use serde::{Deserialize, Serialize}; use std::{ @@ -79,7 +74,7 @@ where method: "".into(), body: serialize(value.get_ref()).unwrap(), metadata: value.get_metadata().clone(), - status: Status::new(Code::Ok, ""), + status: Status::ok(""), } } } @@ -94,7 +89,7 @@ where method: "".into(), body: serialize(value.get_ref()).unwrap(), metadata: value.get_metadata().clone(), - status: Status::new(Code::Ok, ""), + status: Status::ok(""), } } }