feat(headers): allow ExtendedValue structs to be formatted and used as struct members
This commit is contained in:
@@ -56,6 +56,7 @@ pub fn fmt_comma_delimited<T: Display>(f: &mut fmt::Formatter, parts: &[T]) -> f
|
|||||||
|
|
||||||
/// An extended header parameter value (i.e., tagged with a character set and optionally,
|
/// An extended header parameter value (i.e., tagged with a character set and optionally,
|
||||||
/// a language), as defined in [RFC 5987](https://tools.ietf.org/html/rfc5987#section-3.2).
|
/// a language), as defined in [RFC 5987](https://tools.ietf.org/html/rfc5987#section-3.2).
|
||||||
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub struct ExtendedValue {
|
pub struct ExtendedValue {
|
||||||
pub charset: Charset,
|
pub charset: Charset,
|
||||||
pub language_tag: Option<LanguageTag>,
|
pub language_tag: Option<LanguageTag>,
|
||||||
@@ -130,10 +131,23 @@ pub fn parse_extended_value(val: &str) -> ::Result<ExtendedValue> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Display for ExtendedValue {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
let encoded_value =
|
||||||
|
percent_encoding::percent_encode(&self.value[..],
|
||||||
|
percent_encoding::HTTP_VALUE_ENCODE_SET);
|
||||||
|
if let Some(ref lang) = self.language_tag {
|
||||||
|
write!(f, "{}'{}'{}", self.charset, lang, encoded_value)
|
||||||
|
} else {
|
||||||
|
write!(f, "{}''{}", self.charset, encoded_value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use header::shared::Charset;
|
use header::shared::Charset;
|
||||||
use super::parse_extended_value;
|
use super::{ExtendedValue, parse_extended_value};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_extended_value_with_encoding_and_language_tag() {
|
fn test_parse_extended_value_with_encoding_and_language_tag() {
|
||||||
@@ -180,4 +194,26 @@ mod tests {
|
|||||||
let result = parse_extended_value("blank second part'");
|
let result = parse_extended_value("blank second part'");
|
||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_fmt_extended_value_with_encoding_and_language_tag() {
|
||||||
|
let extended_value = ExtendedValue {
|
||||||
|
charset: Charset::Iso_8859_1,
|
||||||
|
language_tag: Some("en".parse().expect("Could not parse language tag")),
|
||||||
|
value: vec![163, b' ', b'r', b'a', b't', b'e', b's'],
|
||||||
|
};
|
||||||
|
assert_eq!("ISO-8859-1'en'%A3%20rates", format!("{}", extended_value));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_fmt_extended_value_with_encoding() {
|
||||||
|
let extended_value = ExtendedValue {
|
||||||
|
charset: Charset::Ext("UTF-8".to_string()),
|
||||||
|
language_tag: None,
|
||||||
|
value: vec![194, 163, b' ', b'a', b'n', b'd', b' ', 226, 130, 172, b' ', b'r', b'a',
|
||||||
|
b't', b'e', b's'],
|
||||||
|
};
|
||||||
|
assert_eq!("UTF-8''%C2%A3%20and%20%E2%82%AC%20rates",
|
||||||
|
format!("{}", extended_value));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user