diff --git a/src/ext.rs b/src/ext.rs new file mode 100644 index 00000000..9b06c5e1 --- /dev/null +++ b/src/ext.rs @@ -0,0 +1,34 @@ +use crate::{Header, HeaderValue}; + +/// An external trait adding helper methods to types which implement [`Header`] trait. +pub trait HeaderExt: Header + self::sealed::Sealed { + /// Encode this [`Header`] to [`HeaderValue`]. + fn encode_to_value(&self) -> HeaderValue; +} + +impl HeaderExt for H +where + H: Header + self::sealed::Sealed, +{ + fn encode_to_value(&self) -> HeaderValue { + let mut container = Vec::with_capacity(1); + self.encode(&mut container); + container.remove(0) + } +} + +mod sealed { + pub trait Sealed {} + impl Sealed for H {} +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn encode_header() { + let header_value = crate::AcceptRanges::bytes().encode_to_value(); + assert_eq!(header_value, HeaderValue::from_static("bytes")); + } +} diff --git a/src/lib.rs b/src/lib.rs index 18c57fba..e3b36b16 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -93,7 +93,9 @@ pub use http::header::{HeaderName, HeaderValue}; #[macro_use] mod util; mod common; +mod ext; mod map_ext; pub use self::common::*; +pub use self::ext::HeaderExt; pub use self::map_ext::HeaderMapExt;