Return Result<(), RenderError> in `Render` trait methods

This commit is contained in:
Kogia-sima 2020-06-09 22:49:44 +09:00
parent cd1b286f1b
commit 95e707152a
1 changed files with 31 additions and 36 deletions

View File

@ -1,15 +1,14 @@
use std::fmt;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use super::buffer::Buffer; use super::buffer::Buffer;
use super::escape; use super::{escape, RenderError};
/// types which can be rendered inside buffer block (`<%= %>`) /// types which can be rendered inside buffer block (`<%= %>`)
pub trait Render { pub trait Render {
fn render(&self, b: &mut Buffer) -> fmt::Result; fn render(&self, b: &mut Buffer) -> Result<(), RenderError>;
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
let mut tmp = Buffer::new(); let mut tmp = Buffer::new();
self.render(&mut tmp)?; self.render(&mut tmp)?;
b.push_str(tmp.as_str()); b.push_str(tmp.as_str());
@ -21,34 +20,34 @@ pub trait Render {
// /// // ///
// /// Explanation can be found [here](https://github.com/dtolnay/case-studies/blob/master/autoref-specialization/README.md) // /// Explanation can be found [here](https://github.com/dtolnay/case-studies/blob/master/autoref-specialization/README.md)
// impl<T: Display> Render for &T { // impl<T: Display> Render for &T {
// fn render(&self, b: &mut Buffer) -> fmt::Result { // fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
// fmt::write(b, format_args!("{}", self)) // fmt::write(b, format_args!("{}", self))
// } // }
// //
// fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { // fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
// struct Wrapper<'a>(&'a mut Buffer); // struct Wrapper<'a>(&'a mut Buffer);
// //
// impl<'a> fmt::Write for Wrapper<'a> { // impl<'a> fmt::Write for Wrapper<'a> {
// #[inline] // #[inline]
// fn push_str(&mut self, s: &str) -> fmt::Result { // fn push_str(&mut self, s: &str) -> Result<(), RenderError> {
// escape::escape_to_buf(s, self.0); // escape::escape_to_buf(s, self.0);
// Ok(()) // Ok(())
// } // }
// } // }
// //
// fmt::write(&mut Wrapper(b), format_args!("{}", self)) // fmt::write(&mut Wrapper(b), format_args!("{}", self))
// } // }
// } // }
impl Render for str { impl Render for str {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
b.push_str(self); b.push_str(self);
Ok(()) Ok(())
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
escape::escape_to_buf(self, b); escape::escape_to_buf(self, b);
Ok(()) Ok(())
} }
@ -56,13 +55,13 @@ impl Render for str {
impl<'a> Render for &'a str { impl<'a> Render for &'a str {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
b.push_str(self); b.push_str(self);
Ok(()) Ok(())
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
// escape string // escape string
escape::escape_to_buf(self, b); escape::escape_to_buf(self, b);
Ok(()) Ok(())
@ -71,13 +70,13 @@ impl<'a> Render for &'a str {
impl Render for String { impl Render for String {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
b.push_str(self); b.push_str(self);
Ok(()) Ok(())
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
// escape string // escape string
escape::escape_to_buf(self, b); escape::escape_to_buf(self, b);
Ok(()) Ok(())
@ -86,13 +85,13 @@ impl Render for String {
impl Render for char { impl Render for char {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
b.push(*self); b.push(*self);
Ok(()) Ok(())
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
match *self { match *self {
'\"' => b.push_str("&quot;"), '\"' => b.push_str("&quot;"),
'&' => b.push_str("&amp;"), '&' => b.push_str("&amp;"),
@ -106,14 +105,14 @@ impl Render for char {
impl<'a> Render for &'a Path { impl<'a> Render for &'a Path {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
// TODO: speed up on Windows using OsStrExt // TODO: speed up on Windows using OsStrExt
b.push_str(&*self.to_string_lossy()); b.push_str(&*self.to_string_lossy());
Ok(()) Ok(())
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
escape::escape_to_buf(&*self.to_string_lossy(), b); escape::escape_to_buf(&*self.to_string_lossy(), b);
Ok(()) Ok(())
} }
@ -121,13 +120,13 @@ impl<'a> Render for &'a Path {
impl Render for PathBuf { impl Render for PathBuf {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
b.push_str(&*self.to_string_lossy()); b.push_str(&*self.to_string_lossy());
Ok(()) Ok(())
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
// escape string // escape string
escape::escape_to_buf(&*self.to_string_lossy(), b); escape::escape_to_buf(&*self.to_string_lossy(), b);
@ -137,7 +136,7 @@ impl Render for PathBuf {
// impl Render for [u8] { // impl Render for [u8] {
// #[inline] // #[inline]
// fn render(&self, b: &mut Buffer) -> fmt::Result { // fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
// b.write_bytes(self); // b.write_bytes(self);
// Ok(()) // Ok(())
// } // }
@ -145,7 +144,7 @@ impl Render for PathBuf {
// //
// impl<'a> Render for &'a [u8] { // impl<'a> Render for &'a [u8] {
// #[inline] // #[inline]
// fn render(&self, b: &mut Buffer) -> fmt::Result { // fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
// b.write_bytes(self); // b.write_bytes(self);
// Ok(()) // Ok(())
// } // }
@ -153,7 +152,7 @@ impl Render for PathBuf {
// //
// impl Render for Vec<u8> { // impl Render for Vec<u8> {
// #[inline] // #[inline]
// fn render(&self, b: &mut Buffer) -> fmt::Result { // fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
// b.write_bytes(&**self); // b.write_bytes(&**self);
// Ok(()) // Ok(())
// } // }
@ -161,18 +160,14 @@ impl Render for PathBuf {
impl Render for bool { impl Render for bool {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
let s = if *self { let s = if *self { "true" } else { "false" };
"true"
} else {
"false"
};
b.push_str(s); b.push_str(s);
Ok(()) Ok(())
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
self.render(b) self.render(b)
} }
} }
@ -182,7 +177,7 @@ macro_rules! render_int {
$( $(
impl Render for $int { impl Render for $int {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
let mut buffer = itoa::Buffer::new(); let mut buffer = itoa::Buffer::new();
let s = buffer.format(*self); let s = buffer.format(*self);
b.push_str(s); b.push_str(s);
@ -190,7 +185,7 @@ macro_rules! render_int {
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
// push_str without escape // push_str without escape
self.render(b) self.render(b)
} }
@ -206,7 +201,7 @@ macro_rules! render_float {
$( $(
impl Render for $float { impl Render for $float {
#[inline] #[inline]
fn render(&self, b: &mut Buffer) -> fmt::Result { fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
let mut buffer = ryu::Buffer::new(); let mut buffer = ryu::Buffer::new();
let s = buffer.format(*self); let s = buffer.format(*self);
b.push_str(s); b.push_str(s);
@ -214,7 +209,7 @@ macro_rules! render_float {
} }
#[inline] #[inline]
fn render_escaped(&self, b: &mut Buffer) -> fmt::Result { fn render_escaped(&self, b: &mut Buffer) -> Result<(), RenderError> {
// escape string // escape string
self.render(b) self.render(b)
} }