#![deny(missing_docs)]
mod encode;
mod entities;
use encode::encode_attribute;
use encode::encode_attribute_w;
use std::io::Write;
use std::io;
pub struct Escaped<T: AsRef<str>> {
inner: T
}
impl<T: AsRef<str>> Escaped<T> {
pub fn into_inner(self) -> T {
self.inner
}
}
pub trait Append<T> {
fn append_str(&mut self, string: T);
}
impl<T: Escapable> Append<T> for Escaped<String> {
fn append_str(&mut self, string: T) {
self.append_str(string.escape())
}
}
impl<T: AsRef<str>> Append<Escaped<T>> for Escaped<String> {
fn append_str(&mut self, string: Escaped<T>) {
self.inner.push_str(string.inner.as_ref());
}
}
impl<T: AsRef<str>> Escaped<T> {
fn as_ref(&self) -> &str {
self.inner.as_ref()
}
}
pub struct EscapedWriter<T: Write> {
inner: T
}
impl<T: Write> EscapedWriter<T> {
pub fn new(inner: T) -> Self {
EscapedWriter { inner: inner }
}
pub fn into_inner(self) -> T {
self.inner
}
}
pub trait Escapable: AsRef<str> {
fn escape(&self) -> Escaped<String>;
fn safe(&self) -> Escaped<String>;
}
impl<T: AsRef<str>> Escapable for T {
fn escape(&self) -> Escaped<String> {
Escaped { inner: encode_attribute(self.as_ref()) }
}
fn safe(&self) -> Escaped<String> {
Escaped { inner: self.as_ref().into() }
}
}
pub trait EscapedWrite<T> {
fn write_str(&mut self, value: T) -> io::Result<()>;
}
impl<X: AsRef<str>, W: Write> EscapedWrite<Escaped<X>> for EscapedWriter<W> {
fn write_str(&mut self, value: Escaped<X>) -> io::Result<()> {
self.inner.write_all(value.as_ref().as_bytes())
}
}
impl<'a, X: Escapable, W: Write> EscapedWrite<X> for EscapedWriter<W> {
fn write_str(&mut self, value: X) -> io::Result<()> {
encode_attribute_w(value.as_ref(), &mut self.inner)
}
}