use std::fmt;
use std::str::{FromStr};
use {Header, HttpDate, Raw};
use parsing::from_one_raw_str;
#[derive(PartialEq, Clone, Debug)]
pub struct Warning {
pub code: u16,
pub agent: String,
pub text: String,
pub date: Option<HttpDate>
}
impl Header for Warning {
fn header_name() -> &'static str {
static NAME: &'static str = "Warning";
NAME
}
fn parse_header(raw: &Raw) -> ::Result<Warning> {
from_one_raw_str(raw)
}
fn fmt_header(&self, f: &mut ::Formatter) -> fmt::Result {
f.fmt_line(self)
}
}
impl fmt::Display for Warning {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.date {
Some(date) => write!(f, "{:03} {} \"{}\" \"{}\"", self.code, self.agent, self.text, date),
None => write!(f, "{:03} {} \"{}\"", self.code, self.agent, self.text)
}
}
}
impl FromStr for Warning {
type Err = ::Error;
fn from_str(s: &str) -> ::Result<Warning> {
let mut warning_split = s.split_whitespace();
let code = match warning_split.next() {
Some(c) => match c.parse::<u16>() {
Ok(c) => c,
Err(..) => return Err(::Error::Header)
},
None => return Err(::Error::Header)
};
let agent = match warning_split.next() {
Some(a) => a.to_string(),
None => return Err(::Error::Header)
};
let mut warning_split = s.split('"').skip(1);
let text = match warning_split.next() {
Some(t) => t.to_string(),
None => return Err(::Error::Header)
};
let date = match warning_split.skip(1).next() {
Some(d) => d.parse::<HttpDate>().ok(),
None => None };
Ok(Warning {
code: code,
agent: agent,
text: text,
date: date
})
}
}
#[cfg(test)]
mod tests {
use super::Warning;
use {Header, HttpDate};
#[test]
fn test_parsing() {
let warning = Header::parse_header(&vec![b"112 - \"network down\" \"Sat, 25 Aug 2012 23:34:45 GMT\"".to_vec()].into());
assert_eq!(warning.ok(), Some(Warning {
code: 112,
agent: "-".to_owned(),
text: "network down".to_owned(),
date: "Sat, 25 Aug 2012 23:34:45 GMT".parse::<HttpDate>().ok()
}));
let warning = Header::parse_header(&vec![b"299 api.hyper.rs:8080 \"Deprecated API : use newapi.hyper.rs instead.\"".to_vec()].into());
assert_eq!(warning.ok(), Some(Warning {
code: 299,
agent: "api.hyper.rs:8080".to_owned(),
text: "Deprecated API : use newapi.hyper.rs instead.".to_owned(),
date: None
}));
let warning = Header::parse_header(&vec![b"299 api.hyper.rs:8080 \"Deprecated API : use newapi.hyper.rs instead.\" \"Tue, 15 Nov 1994 08:12:31 GMT\"".to_vec()].into());
assert_eq!(warning.ok(), Some(Warning {
code: 299,
agent: "api.hyper.rs:8080".to_owned(),
text: "Deprecated API : use newapi.hyper.rs instead.".to_owned(),
date: "Tue, 15 Nov 1994 08:12:31 GMT".parse::<HttpDate>().ok()
}));
}
}