use std::io;
use std::str::from_utf8;
use chrono::{DateTime, FixedOffset};
use codecs;
use mimetype::MimeType;
use parser::base::{DecodeResult, DecodeError, XmlElement};
use schema::Codec;
pub use self::category::Category;
pub use self::content::Content;
pub use self::entry::Entry;
pub use self::feed::Feed;
pub use self::generator::Generator;
pub use self::link::{Link, LinkIteratorExt, LinkList};
pub use self::mark::Mark;
pub use self::metadata::Metadata;
pub use self::person::Person;
pub use self::source::Source;
pub use self::text::Text;
mod category;
mod content;
mod entry;
mod feed;
mod generator;
mod link;
mod mark;
mod metadata;
mod person;
mod source;
mod text;
const ATOM_XMLNS: &'static str = "http://www.w3.org/2005/Atom";
const MARK_XMLNS: &'static str = "http://earthreader.org/mark/";
pub trait Blob {
fn mimetype(&self) -> MimeType;
fn is_text(&self) -> bool { self.mimetype().is_text() }
fn as_bytes(&self) -> &[u8];
fn as_str(&self) -> Option<&str> { from_utf8(self.as_bytes()).ok() }
}
#[cfg(html_sanitizer)]
pub trait HtmlBlob: Blob {
fn sanitized_html<'a>(&'a self, base_uri: Option<&'a str>) ->
Box<fmt::Display + 'a>;
}
fn parse_datetime<B: io::BufRead>(element: XmlElement<B>)
-> DecodeResult<DateTime<FixedOffset>>
{
match codecs::RFC3339.decode(&*try!(element.read_whole_text())) {
Ok(v) => Ok(v),
Err(e) => Err(DecodeError::SchemaError(e)),
}
}