From c64d486b92009d93e0ab3a6b0cc2ac9ed28bb58a Mon Sep 17 00:00:00 2001 From: tottoto Date: Tue, 5 Mar 2024 22:37:38 +0900 Subject: [PATCH 1/2] feat: add integration with request builder --- src/lib.rs | 2 ++ src/request_builder_ext.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/request_builder_ext.rs diff --git a/src/lib.rs b/src/lib.rs index 40f2de40..33f088cb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -88,6 +88,8 @@ pub use http::header::{HeaderName, HeaderValue}; mod util; mod common; mod map_ext; +mod request_builder_ext; pub use self::common::*; pub use self::map_ext::HeaderMapExt; +pub use self::request_builder_ext::RequestBuilderExt; diff --git a/src/request_builder_ext.rs b/src/request_builder_ext.rs new file mode 100644 index 00000000..c2800747 --- /dev/null +++ b/src/request_builder_ext.rs @@ -0,0 +1,38 @@ +use crate::{Header, HeaderMapExt}; + +/// An external trait adding helper methods to http request builder. +pub trait RequestBuilderExt: self::sealed::Sealed { + /// Appends a typed header to this request builder. + fn typed_header(self, header: impl Header) -> Self; +} + +impl RequestBuilderExt for http::request::Builder { + fn typed_header(mut self, header: impl Header) -> Self { + self.headers_mut() + .map(|header_map| header_map.typed_insert(header)); + self + } +} + +mod sealed { + pub trait Sealed {} + impl Sealed for http::request::Builder {} +} + +#[cfg(test)] +mod tests { + use super::RequestBuilderExt; + + #[test] + fn test_with_header_map_get_method() { + let request = http::Request::builder() + .typed_header(crate::ContentType::text()) + .body(()) + .unwrap(); + + assert_eq!( + request.headers().get(http::header::CONTENT_TYPE).unwrap(), + "text/plain", + ); + } +} From e76e6fd8ee71b6bbc9489b129461f5e7b40e8ad2 Mon Sep 17 00:00:00 2001 From: tottoto Date: Tue, 5 Mar 2024 22:38:04 +0900 Subject: [PATCH 2/2] feat: add integration with response builder --- src/lib.rs | 2 ++ src/response_builder_ext.rs | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/response_builder_ext.rs diff --git a/src/lib.rs b/src/lib.rs index 33f088cb..d9e454fa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -89,7 +89,9 @@ mod util; mod common; mod map_ext; mod request_builder_ext; +mod response_builder_ext; pub use self::common::*; pub use self::map_ext::HeaderMapExt; pub use self::request_builder_ext::RequestBuilderExt; +pub use self::response_builder_ext::ResponseBuilderExt; diff --git a/src/response_builder_ext.rs b/src/response_builder_ext.rs new file mode 100644 index 00000000..d56ab3c1 --- /dev/null +++ b/src/response_builder_ext.rs @@ -0,0 +1,38 @@ +use crate::{Header, HeaderMapExt}; + +/// An external trait adding helper methods to http response builder. +pub trait ResponseBuilderExt: self::sealed::Sealed { + /// Appends a typed header to this response builder. + fn typed_header(self, header: impl Header) -> Self; +} + +impl ResponseBuilderExt for http::response::Builder { + fn typed_header(mut self, header: impl Header) -> Self { + self.headers_mut() + .map(|header_map| header_map.typed_insert(header)); + self + } +} + +mod sealed { + pub trait Sealed {} + impl Sealed for http::response::Builder {} +} + +#[cfg(test)] +mod tests { + use super::ResponseBuilderExt; + + #[test] + fn test_with_header_map_get_method() { + let response = http::Response::builder() + .typed_header(crate::ContentType::text()) + .body(()) + .unwrap(); + + assert_eq!( + response.headers().get(http::header::CONTENT_TYPE).unwrap(), + "text/plain", + ); + } +}