From ee3d0dfe7556fc7e996764f650ee3351097e7309 Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Mon, 12 Sep 2022 17:31:30 +0200 Subject: [PATCH] feat(tonic): impl `Clone` for `Status` using `Arc` (#1076) --- tonic/src/status.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tonic/src/status.rs b/tonic/src/status.rs index 2aef8bf41..0c34160a9 100644 --- a/tonic/src/status.rs +++ b/tonic/src/status.rs @@ -3,7 +3,7 @@ use crate::metadata::MetadataMap; use bytes::Bytes; use http::header::{HeaderMap, HeaderValue}; use percent_encoding::{percent_decode, percent_encode, AsciiSet, CONTROLS}; -use std::{borrow::Cow, error::Error, fmt}; +use std::{borrow::Cow, error::Error, fmt, sync::Arc}; use tracing::{debug, trace, warn}; const ENCODING_SET: &AsciiSet = &CONTROLS @@ -33,6 +33,7 @@ const GRPC_STATUS_DETAILS_HEADER: &str = "grpc-status-details-bin"; /// assert_eq!(status1.code(), Code::InvalidArgument); /// assert_eq!(status1.code(), status2.code()); /// ``` +#[derive(Clone)] pub struct Status { /// The gRPC status code, found in the `grpc-status` header. code: Code, @@ -45,7 +46,7 @@ pub struct Status { /// or by `Status` fields above, they will be ignored. metadata: MetadataMap, /// Optional underlying error. - source: Option>, + source: Option>, } /// gRPC status codes used by [`Status`]. @@ -318,7 +319,7 @@ impl Status { pub fn from_error(err: Box) -> Status { Status::try_from_error(err).unwrap_or_else(|err| { let mut status = Status::new(Code::Unknown, err.to_string()); - status.source = Some(err); + status.source = Some(err.into()); status }) } @@ -342,7 +343,7 @@ impl Status { }; if let Some(mut status) = find_status_in_source_chain(&*err) { - status.source = Some(err); + status.source = Some(err.into()); return Ok(status); } @@ -370,7 +371,7 @@ impl Status { }; let mut status = Self::new(code, format!("h2 protocol error: {}", err)); - status.source = Some(err); + status.source = Some(Arc::new(*err)); status }