From cfc158dcb870f66c9a14e4b46a2471651d8c7a84 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 31 Oct 2021 09:42:10 +0100 Subject: [PATCH] Change to return Err when an awaited response is an error response Signed-off-by: trivernis --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/error.rs | 4 ++++ src/events/error_event.rs | 10 ++++++++++ src/ipc/stream_emitter.rs | 7 ++++++- src/tests/ipc_tests.rs | 5 ++--- 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index acdf68c9..d20532b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -500,7 +500,7 @@ dependencies = [ [[package]] name = "rmp-ipc" -version = "0.7.2" +version = "0.8.0" dependencies = [ "criterion", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index 780c7c3d..4b951986 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rmp-ipc" -version = "0.7.2" +version = "0.8.0" authors = ["trivernis "] edition = "2018" readme = "README.md" diff --git a/src/error.rs b/src/error.rs index 933b39af..22d01973 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,4 @@ +use crate::error_event::ErrorEventData; use thiserror::Error; use tokio::sync::oneshot; @@ -25,6 +26,9 @@ pub enum Error { #[error("Send Error")] SendError, + + #[error("Error response: {0}")] + ErrorEvent(#[from] ErrorEventData), } impl From for Error { diff --git a/src/events/error_event.rs b/src/events/error_event.rs index e11ae703..00a471c5 100644 --- a/src/events/error_event.rs +++ b/src/events/error_event.rs @@ -1,4 +1,6 @@ use serde::{Deserialize, Serialize}; +use std::error::Error; +use std::fmt::{Display, Formatter}; pub static ERROR_EVENT_NAME: &str = "error"; @@ -11,3 +13,11 @@ pub struct ErrorEventData { pub code: u16, pub message: String, } + +impl Error for ErrorEventData {} + +impl Display for ErrorEventData { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "IPC Code {}: '{}'", self.code, self.message) + } +} diff --git a/src/ipc/stream_emitter.rs b/src/ipc/stream_emitter.rs index 13b549fd..996fdb88 100644 --- a/src/ipc/stream_emitter.rs +++ b/src/ipc/stream_emitter.rs @@ -1,4 +1,5 @@ use crate::error::Result; +use crate::error_event::{ErrorEventData, ERROR_EVENT_NAME}; use crate::events::event::Event; use crate::events::payload::EventSendPayload; use crate::ipc::context::Context; @@ -119,6 +120,10 @@ impl EmitMetadata { #[tracing::instrument(skip(self, ctx), fields(self.message_id))] pub async fn await_reply(&self, ctx: &Context) -> Result { let reply = ctx.await_reply(self.message_id).await?; - Ok(reply) + if reply.name() == ERROR_EVENT_NAME { + Err(reply.data::()?.into()) + } else { + Ok(reply) + } } } diff --git a/src/tests/ipc_tests.rs b/src/tests/ipc_tests.rs index c738a339..95430efe 100644 --- a/src/tests/ipc_tests.rs +++ b/src/tests/ipc_tests.rs @@ -205,7 +205,6 @@ async fn test_error_responses() { .await .unwrap() .await_reply(&ctx) - .await - .unwrap(); - assert_eq!(reply.name(), "error"); + .await; + assert!(reply.is_err()); }