rustache/
lib.rs

1#![deny(missing_docs)]
2#![recursion_limit = "1024"]
3
4//! The main crate for the Rustache library.
5//!
6//! Rustache is a flexible template engine for Rust.
7#[macro_use]
8extern crate error_chain;
9extern crate rustc_serialize;
10
11use std::fmt;
12use std::cell::RefCell;
13use std::collections::HashMap;
14use std::convert::From;
15use std::string;
16
17pub use build::{HashBuilder, VecBuilder};
18pub use rustache::Render;
19
20/// Alias for Result<T, `RustacheError`>
21pub use errors::*;
22
23// Represents the possible types that passed in data may take on
24#[doc(hidden)]
25pub enum Data<'a> {
26    String(string::String),
27    Bool(bool),
28    Integer(i32),
29    Float(f64),
30    Vector(self::Vector<'a>),
31    Hash(self::Hash<'a>),
32    Lambda(RefCell<self::Lambda<'a>>),
33}
34
35/// Alias for mustache data vectors
36pub type Vector<'a> = Vec<Data<'a>>;
37/// Alias for mustache data hashes
38pub type Hash<'a> = HashMap<string::String, Data<'a>>;
39/// Alias for a Lambda functions to transform data
40pub type Lambda<'a> = &'a mut FnMut(string::String) -> string::String;
41
42impl<'a, 'b> From<&'b str> for Data<'a> {
43    fn from(v: &'b str) -> Data<'a> {
44        Data::String(v.to_owned())
45    }
46}
47
48impl<'a> From<string::String> for Data<'a> {
49    fn from(v: string::String) -> Data<'a> {
50        Data::String(v)
51    }
52}
53
54impl<'a> From<bool> for Data<'a> {
55    fn from(v: bool) -> Data<'a> {
56        Data::Bool(v)
57    }
58}
59
60impl<'a> From<i32> for Data<'a> {
61    fn from(v: i32) -> Data<'a> {
62        Data::Integer(v)
63    }
64}
65
66impl<'a> From<f64> for Data<'a> {
67    fn from(v: f64) -> Data<'a> {
68        Data::Float(v)
69    }
70}
71
72impl<'a> From<self::Vector<'a>> for Data<'a> {
73    fn from(v: self::Vector<'a>) -> Data<'a> {
74        Data::Vector(v)
75    }
76}
77
78impl<'a> From<self::Hash<'a>> for Data<'a> {
79    fn from(v: self::Hash<'a>) -> Data<'a> {
80        Data::Hash(v)
81    }
82}
83
84impl<'a> From<self::Lambda<'a>> for Data<'a> {
85    fn from(v: self::Lambda<'a>) -> Data<'a> {
86        Data::Lambda(RefCell::new(v))
87    }
88}
89
90// |String|: 'a -> String : F Above
91
92// Implementing custom PartialEq for Data
93impl<'a> PartialEq for Data<'a> {
94    fn eq(&self, other: &Data<'a>) -> bool {
95        match (self, other) {
96            (&Data::String(ref val0), &Data::String(ref val1)) => val0 == val1,
97            (&Data::Bool(ref val0), &Data::Bool(ref val1)) => val0 == val1,
98            (&Data::Integer(ref val0), &Data::Integer(ref val1)) => val0 == val1,
99            (&Data::Float(ref val0), &Data::Float(ref val1)) => val0 == val1,
100            (&Data::Vector(ref val0), &Data::Vector(ref val1)) => val0 == val1,
101            (&Data::Hash(ref val0), &Data::Hash(ref val1)) => val0 == val1,
102            (&Data::Lambda(_), &Data::Lambda(_)) => panic!("Can't compare closures"),
103            (_, _) => false,
104        }
105    }
106}
107
108// Implementing custom Show for Data
109impl<'a> fmt::Debug for Data<'a> {
110    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
111        match *self {
112            Data::String(ref val) => write!(f, "String({:?})", val),
113            Data::Bool(val) => write!(f, "Boolean({:?})", val),
114            Data::Integer(ref val) => write!(f, "Integer({:?})", val),
115            Data::Float(ref val) => write!(f, "Float({:?})", val),
116            Data::Vector(ref val) => write!(f, "Vector({:?})", val),
117            Data::Hash(ref val) => write!(f, "Hash({:?})", val),
118            Data::Lambda(_) => write!(f, "Lambda(...)"),
119        }
120    }
121}
122
123// Internal Modules
124mod errors;
125mod rustache;
126mod compiler;
127mod parser;
128mod build;
129mod template;