Add minimal runtime filters

This commit is contained in:
Kogia-sima 2020-07-15 07:31:07 +09:00
parent 373ffc135e
commit eac0dfbf5b
2 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,87 @@
// TODO: performance improvement
use std::fmt;
use super::{Buffer, Render, RenderError};
pub struct Display<'a, T>(&'a T);
impl<'a, T: fmt::Display> Render for Display<'a, T> {
fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
use fmt::Write;
write!(b, "{}", self.0).map_err(|e| RenderError::from(e))
}
}
/// render using `std::fmt::Display` trait
#[inline]
pub fn disp<T: fmt::Display>(expr: &T) -> Display<T> {
Display(expr)
}
pub struct Debug<'a, T>(&'a T);
impl<'a, T: fmt::Debug> Render for Debug<'a, T> {
fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
use fmt::Write;
write!(b, "{:?}", self.0).map_err(|e| RenderError::from(e))
}
}
/// render using `std::fmt::Debug` trait
#[inline]
pub fn dbg<T: fmt::Debug>(expr: &T) -> Debug<T> {
Debug(expr)
}
pub struct Upper<'a, T>(&'a T);
impl<'a, T: Render> Render for Upper<'a, T> {
fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
let old_len = b.len();
self.0.render(b)?;
let s = b.as_str()[old_len..].to_uppercase();
unsafe { b.set_len(old_len) };
b.push_str(&*s);
Ok(())
}
}
/// convert the rendered contents to uppercase
#[inline]
pub fn upper<T: Render>(expr: &T) -> Upper<T> {
Upper(expr)
}
pub struct Lower<'a, T>(&'a T);
impl<'a, T: Render> Render for Lower<'a, T> {
fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
let old_len = b.len();
self.0.render(b)?;
let s = b.as_str()[old_len..].to_lowercase();
unsafe { b.set_len(old_len) };
b.push_str(&*s);
Ok(())
}
fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
let old_len = b.len();
self.0.render_escaped(b)?;
let s = b.as_str()[old_len..].to_lowercase();
unsafe { b.set_len(old_len) };
b.push_str(&*s);
Ok(())
}
}
/// convert the rendered contents to lowercase
#[inline]
pub fn lower<T: Render>(expr: &T) -> Lower<T> {
Lower(expr)
}

View File

@ -5,6 +5,7 @@ mod utils;
mod buffer;
pub mod escape;
pub mod filter;
mod macros;
mod render;
mod size_hint;