1#![deny(missing_docs)]
2#![recursion_limit = "1024"]
3
4#[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
20pub use errors::*;
22
23#[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
35pub type Vector<'a> = Vec<Data<'a>>;
37pub type Hash<'a> = HashMap<string::String, Data<'a>>;
39pub 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
90impl<'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
108impl<'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
123mod errors;
125mod rustache;
126mod compiler;
127mod parser;
128mod build;
129mod template;