diff --git a/maud/src/lib.rs b/maud/src/lib.rs index 9aa28b77..94918ac7 100644 --- a/maud/src/lib.rs +++ b/maud/src/lib.rs @@ -11,7 +11,7 @@ extern crate alloc; -use alloc::{borrow::Cow, boxed::Box, string::String, sync::Arc}; +use alloc::{borrow::Cow, boxed::Box, string::String, sync::Arc, vec::Vec}; use core::fmt::{self, Arguments, Display, Write}; pub use maud_macros::html; @@ -156,6 +156,30 @@ impl Render for Arc { } } +impl Render for Vec { + fn render_to(&self, w: &mut String) { + for item in self { + item.render_to(w); + } + } +} + +impl Render for [T] { + fn render_to(&self, w: &mut String) { + for item in self { + item.render_to(w); + } + } +} + +impl Render for Option { + fn render_to(&self, w: &mut String) { + if let Some(ref value) = *self { + value.render_to(w); + } + } +} + macro_rules! impl_render_with_display { ($($ty:ty)*) => { $( diff --git a/maud/tests/misc.rs b/maud/tests/misc.rs index 2a573013..0df15be7 100644 --- a/maud/tests/misc.rs +++ b/maud/tests/misc.rs @@ -1,4 +1,4 @@ -use maud::html; +use maud::{html, Render}; #[test] fn issue_13() { @@ -143,3 +143,35 @@ fn render_arc() { let arc = std::sync::Arc::new("foo"); assert_eq!(html! { (arc) }.into_string(), "foo"); } + +#[test] +fn render_vec_generics() { + let vec = vec![1, 2, 3]; + assert_eq!(vec.render().into_string(), "123"); + let vec = vec!["a", "b", "c"]; + assert_eq!(vec.render().into_string(), "abc"); + let vec = vec![String::from("a"), String::from("b"), String::from("c")]; + assert_eq!(vec.render().into_string(), "abc"); +} + +#[test] +fn render_slice_generics() { + let slice = &[1, 2, 3]; + assert_eq!(slice.render().into_string(), "123"); + let slice = &["a", "b", "c"]; + assert_eq!(slice.render().into_string(), "abc"); + let slice = &[String::from("a"), String::from("b"), String::from("c")]; + assert_eq!(slice.render().into_string(), "abc"); +} + +#[test] +fn render_option_generics() { + let option = Some(42); + assert_eq!(option.render().into_string(), "42"); + let option = Some("foo"); + assert_eq!(option.render().into_string(), "foo"); + let option = Some(String::from("bar")); + assert_eq!(option.render().into_string(), "bar"); + let option: Option = None; + assert_eq!(option.render().into_string(), ""); +}