diff --git a/src/lib.rs b/src/lib.rs index 874c5a0..b8c6182 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use core::fmt::{Display, Write}; +use core::fmt::Write; pub mod internal; @@ -7,7 +7,7 @@ use internal::{ parse::{parse, Ast}, }; -pub trait Value: core::fmt::Debug { +pub trait Value { fn print(&self, out: &mut String); fn lookup(&self, name: &str) -> Option<&dyn Value>; fn has(&self) -> Option<&dyn Value>; @@ -15,6 +15,48 @@ pub trait Value: core::fmt::Debug { fn for_(&self, index: usize) -> Option<&dyn Value>; } +macro_rules! value_for_int { + ($tp:ty) => { + impl Value for $tp { + fn print(&self, out: &mut String) { + let _ = write!(out, "{self}"); + } + + fn lookup(&self, _: &str) -> Option<&dyn Value> { + None + } + + fn has(&self) -> Option<&dyn Value> { + if self.if_() { + Some(self) + } else { + None + } + } + + fn if_(&self) -> bool { + *self != 0 + } + + fn for_(&self, _: usize) -> Option<&dyn Value> { + None + } + } + }; +} +value_for_int!(u8); +value_for_int!(u16); +value_for_int!(u32); +value_for_int!(u64); +value_for_int!(u128); +value_for_int!(usize); +value_for_int!(i8); +value_for_int!(i16); +value_for_int!(i32); +value_for_int!(i64); +value_for_int!(i128); +value_for_int!(isize); + impl<'a, T> Value for &'a T where T: Value, @@ -70,6 +112,36 @@ impl Value for &str { } } +impl Value for String { + fn print(&self, out: &mut String) { + out.push_str(self); + } + + fn lookup(&self, _: &str) -> Option<&dyn Value> { + None + } + + fn has(&self) -> Option<&dyn Value> { + if self.if_() { + None + } else { + Some(self) + } + } + + fn if_(&self) -> bool { + !self.is_empty() + } + + fn for_(&self, index: usize) -> Option<&dyn Value> { + if index == 0 { + Some(self) + } else { + None + } + } +} + impl Value for (&str, &dyn Value) { fn print(&self, out: &mut String) { out.push('('); @@ -300,10 +372,10 @@ mod test { "{for .items}{for .names}{.}, {/for}{/for}", values_list_map! { "items": values![values_list_map! { - "names": values!["Bob", "Larry"], + "names": values!["Bob", "Larry", 0], }] }, - "Bob, Larry, ", + "Bob, Larry, 0, ", ) }