1#![deny(missing_docs)]
2
3extern crate rustc_serialize;
8
9use std::fmt;
10use std::cell::RefCell;
11use std::collections::HashMap;
12use std::convert::From;
13
14use self::Data::*;
15
16pub use build::{HashBuilder, VecBuilder};
17pub use rustache::Render;
18
19pub type RustacheResult<T> = Result<T, RustacheError>;
21
22#[derive(Debug)]
24pub enum RustacheError {
25 JsonError(String),
29 FileError(String),
31 TemplateErrorType(template::TemplateError),
33}
34
35#[doc(hidden)]
37pub enum Data<'a> {
38 Strng(String),
39 Bool(bool),
40 Integer(i32),
41 Float(f64),
42 Vector(Vec<Data<'a>>),
43 Hash(HashMap<String, Data<'a>>),
44 Lambda(RefCell<&'a mut FnMut(String) -> String>),
45}
46
47impl<'a, 'b> From<&'b str> for Data<'a> {
48 fn from(v: &'b str) -> Data<'a> {
49 Strng(v.to_owned())
50 }
51}
52
53impl<'a> From<String> for Data<'a> {
54 fn from(v: String) -> Data<'a> {
55 Strng(v)
56 }
57}
58
59impl<'a> From<bool> for Data<'a> {
60 fn from(v: bool) -> Data<'a> {
61 Bool(v)
62 }
63}
64
65impl<'a> From<i32> for Data<'a> {
66 fn from(v: i32) -> Data<'a> {
67 Integer(v)
68 }
69}
70
71impl<'a> From<f64> for Data<'a> {
72 fn from(v: f64) -> Data<'a> {
73 Float(v)
74 }
75}
76
77impl<'a> From<Vec<Data<'a>>> for Data<'a> {
78 fn from(v: Vec<Data<'a>>) -> Data<'a> {
79 Vector(v)
80 }
81}
82
83impl<'a> From<HashMap<String, Data<'a>>> for Data<'a> {
84 fn from(v: HashMap<String, Data<'a>>) -> Data<'a> {
85 Hash(v)
86 }
87}
88
89impl<'a> From<&'a mut FnMut(String) -> String> for Data<'a> {
90 fn from(v: &'a mut FnMut(String) -> String) -> Data<'a> {
91 Lambda(RefCell::new(v))
92 }
93}
94
95impl<'a> PartialEq for Data<'a> {
99 fn eq(&self, other: &Data<'a>) -> bool {
100 match (self, other) {
101 (&Strng(ref val0), &Strng(ref val1)) => val0 == val1,
102 (&Bool(ref val0), &Bool(ref val1)) => val0 == val1,
103 (&Integer(ref val0), &Integer(ref val1)) => val0 == val1,
104 (&Float(ref val0), &Float(ref val1)) => val0 == val1,
105 (&Vector(ref val0), &Vector(ref val1)) => val0 == val1,
106 (&Hash(ref val0), &Hash(ref val1)) => val0 == val1,
107 (&Lambda(_), &Lambda(_)) => panic!("Can't compare closures"),
108 (_, _) => false,
109 }
110 }
111}
112
113impl<'a> fmt::Debug for Data<'a> {
115 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
116 match *self {
117 Strng(ref val) => write!(f, "Strng({:?})", val),
118 Bool(val) => write!(f, "Boolean({:?})", val),
119 Integer(ref val) => write!(f, "Integer({:?})", val),
120 Float(ref val) => write!(f, "Float({:?})", val),
121 Vector(ref val) => write!(f, "Vector({:?})", val),
122 Hash(ref val) => write!(f, "Hash({:?})", val),
123 Lambda(_) => write!(f, "Lambda(...)"),
124 }
125 }
126}
127
128mod rustache;
130mod compiler;
131mod parser;
132mod build;
133mod template;