refactor(headers): add header macros and add two example uses
Add `impl_header!` and `impl_list_header!` macros. Rewrite `Accept-Encoding` and `Server` header implementations to use the new macros.
This commit is contained in:
@@ -1,7 +1,4 @@
|
|||||||
use std::fmt;
|
use header::{self, shared};
|
||||||
|
|
||||||
use header;
|
|
||||||
use header::shared;
|
|
||||||
|
|
||||||
/// The `Accept-Encoding` header
|
/// The `Accept-Encoding` header
|
||||||
///
|
///
|
||||||
@@ -10,23 +7,9 @@ use header::shared;
|
|||||||
#[derive(Clone, PartialEq, Show)]
|
#[derive(Clone, PartialEq, Show)]
|
||||||
pub struct AcceptEncoding(pub Vec<shared::QualityItem<shared::Encoding>>);
|
pub struct AcceptEncoding(pub Vec<shared::QualityItem<shared::Encoding>>);
|
||||||
|
|
||||||
deref!(AcceptEncoding => Vec<shared::QualityItem<shared::Encoding>>);
|
impl_list_header!(AcceptEncoding,
|
||||||
|
"Accept-Encoding",
|
||||||
impl header::Header for AcceptEncoding {
|
Vec<shared::QualityItem<shared::Encoding>>);
|
||||||
fn header_name(_: Option<AcceptEncoding>) -> &'static str {
|
|
||||||
"AcceptEncoding"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_header(raw: &[Vec<u8>]) -> Option<AcceptEncoding> {
|
|
||||||
shared::from_comma_delimited(raw).map(AcceptEncoding)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl header::HeaderFormat for AcceptEncoding {
|
|
||||||
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
shared::fmt_comma_delimited(fmt, &self[])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_header() {
|
fn test_parse_header() {
|
||||||
|
|||||||
@@ -76,6 +76,64 @@ macro_rules! deref(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
macro_rules! impl_list_header(
|
||||||
|
($from:ident, $name:expr, $item:ty) => {
|
||||||
|
deref!($from => $item);
|
||||||
|
|
||||||
|
impl header::Header for $from {
|
||||||
|
fn header_name(_: Option<$from>) -> &'static str {
|
||||||
|
$name
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_header(raw: &[Vec<u8>]) -> Option<$from> {
|
||||||
|
$crate::header::shared::from_comma_delimited(raw).map($from)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl header::HeaderFormat for $from {
|
||||||
|
fn fmt_header(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||||
|
$crate::header::shared::fmt_comma_delimited(fmt, &self[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ::std::fmt::String for $from {
|
||||||
|
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||||
|
use header::HeaderFormat;
|
||||||
|
self.fmt_header(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
macro_rules! impl_header(
|
||||||
|
($from:ident, $name:expr, $item:ty) => {
|
||||||
|
deref!($from => $item);
|
||||||
|
|
||||||
|
impl header::Header for $from {
|
||||||
|
fn header_name(_: Option<$from>) -> &'static str {
|
||||||
|
$name
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_header(raw: &[Vec<u8>]) -> Option<$from> {
|
||||||
|
$crate::header::shared::from_one_raw_str(raw).map($from)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl header::HeaderFormat for $from {
|
||||||
|
fn fmt_header(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||||
|
::std::fmt::String::fmt(&**self, f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ::std::fmt::String for $from {
|
||||||
|
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||||
|
use header::HeaderFormat;
|
||||||
|
self.fmt_header(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
/// Exposes the AccessControl* family of headers.
|
/// Exposes the AccessControl* family of headers.
|
||||||
pub mod access_control;
|
pub mod access_control;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use header::{Header, HeaderFormat};
|
use header;
|
||||||
use std::fmt;
|
|
||||||
use header::shared::util::from_one_raw_str;
|
|
||||||
|
|
||||||
/// The `Server` header field.
|
/// The `Server` header field.
|
||||||
///
|
///
|
||||||
@@ -8,22 +6,8 @@ use header::shared::util::from_one_raw_str;
|
|||||||
#[derive(Clone, PartialEq, Show)]
|
#[derive(Clone, PartialEq, Show)]
|
||||||
pub struct Server(pub String);
|
pub struct Server(pub String);
|
||||||
|
|
||||||
deref!(Server => String);
|
impl_header!(Server,
|
||||||
|
"Server",
|
||||||
impl Header for Server {
|
String);
|
||||||
fn header_name(_: Option<Server>) -> &'static str {
|
|
||||||
"Server"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_header(raw: &[Vec<u8>]) -> Option<Server> {
|
|
||||||
from_one_raw_str(raw).map(|s| Server(s))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HeaderFormat for Server {
|
|
||||||
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
fmt.write_str(&*self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bench_header!(bench, Server, { vec![b"Some String".to_vec()] });
|
bench_header!(bench, Server, { vec![b"Some String".to_vec()] });
|
||||||
|
|||||||
Reference in New Issue
Block a user