use std::convert::{From};
use std::error::{Error};
use std::fmt::{self, Display, Formatter};
use std::marker::{Reflect};
pub type SSDPResult<T> = Result<T, SSDPError>;
#[derive(Debug)]
pub enum SSDPError {
InvalidHttp(Vec<u8>),
InvalidHttpVersion,
ResponseCode(u16),
InvalidMethod(String),
InvalidUri(String),
MissingHeader(&'static str),
InvalidHeader(&'static str, &'static str),
Other(Box<Error>)
}
impl Display for SSDPError {
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
match *self {
SSDPError::InvalidHttp(ref n) => {
let http_str = String::from_utf8_lossy(n);
f.write_fmt(format_args!("Invalid Http: {}", http_str))
},
SSDPError::InvalidHttpVersion => {
f.write_str("Invalid Http Version")
},
SSDPError::ResponseCode(n) => {
f.write_fmt(format_args!("Response Code: {}", n))
},
SSDPError::InvalidMethod(ref n) => {
f.write_fmt(format_args!("Invalid Method: {}", n))
},
SSDPError::InvalidUri(ref n) => {
f.write_fmt(format_args!("Invalid URI: {}", n))
},
SSDPError::MissingHeader(n) => {
f.write_fmt(format_args!("Missing Header: {}", n))
},
SSDPError::InvalidHeader(name, value) => {
f.write_fmt(format_args!("Invalid Header: {}: {}", name, value))
},
SSDPError::Other(ref n) => {
f.write_fmt(format_args!("Other: {}", n.description()))
}
}
}
}
impl<T> From<T> for SSDPError where T: Error + 'static {
fn from(err: T) -> SSDPError {
SSDPError::Other(Box::new(err) as Box<Error>)
}
}
#[derive(Debug)]
pub struct MsgError {
desc: &'static str
}
impl MsgError {
pub fn new(desc: &'static str) -> MsgError {
MsgError{ desc: desc }
}
}
impl Reflect for MsgError { }
impl Error for MsgError {
fn description(&self) -> &str {
self.desc
}
}
impl Display for MsgError {
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
f.write_str(self.desc)
}
}
#[cfg(test)]
mod tests {
use std::error::{Error};
use super::{MsgError};
#[test]
fn positive_msg_error_display() {
let error = MsgError::new("Something Happened");
assert_eq!(&error.to_string()[..], "Something Happened");
}
#[test]
fn positive_msg_error_description() {
let error = MsgError::new("Something Happened");
assert_eq!(error.description(), "Something Happened");
}
}