diff --git a/axum-extra/CHANGELOG.md b/axum-extra/CHANGELOG.md index eed4d039fb..6f84ff13c7 100644 --- a/axum-extra/CHANGELOG.md +++ b/axum-extra/CHANGELOG.md @@ -7,9 +7,11 @@ and this project adheres to [Semantic Versioning]. # Unreleased -- **added:** Added `TypedHeader` which used to be in `axum` ([#1850]) +- **added:** `TypedHeader` which used to be in `axum` ([#1850]) +- **added:** `Clone` implementation for `ErasedJson` ([#2142]) [#1850]: https://github.com/tokio-rs/axum/pull/1850 +[#2142]: https://github.com/tokio-rs/axum/pull/2142 # 0.7.4 (18. April, 2023) diff --git a/axum-extra/src/response/erased_json.rs b/axum-extra/src/response/erased_json.rs index df7257c58e..6e94a267e0 100644 --- a/axum-extra/src/response/erased_json.rs +++ b/axum-extra/src/response/erased_json.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use axum::{ http::{header, HeaderValue, StatusCode}, response::{IntoResponse, Response}, @@ -29,21 +31,29 @@ use serde::Serialize; /// } /// ``` #[cfg_attr(docsrs, doc(cfg(feature = "erased-json")))] -#[derive(Debug)] +#[derive(Clone, Debug)] #[must_use] -pub struct ErasedJson(serde_json::Result); +pub struct ErasedJson(Result>); impl ErasedJson { /// Create an `ErasedJson` by serializing a value with the compact formatter. pub fn new(val: T) -> Self { let mut bytes = BytesMut::with_capacity(128); - Self(serde_json::to_writer((&mut bytes).writer(), &val).map(|_| bytes.freeze())) + let result = match serde_json::to_writer((&mut bytes).writer(), &val) { + Ok(()) => Ok(bytes.freeze()), + Err(e) => Err(Arc::new(e)), + }; + Self(result) } /// Create an `ErasedJson` by serializing a value with the pretty formatter. pub fn pretty(val: T) -> Self { let mut bytes = BytesMut::with_capacity(128); - Self(serde_json::to_writer_pretty((&mut bytes).writer(), &val).map(|_| bytes.freeze())) + let result = match serde_json::to_writer_pretty((&mut bytes).writer(), &val) { + Ok(()) => Ok(bytes.freeze()), + Err(e) => Err(Arc::new(e)), + }; + Self(result) } }