tenjin/context/
toml.rs

1use context::Context;
2use error::{Error, Result};
3use path::Path;
4use render::Chomp;
5use toml::Value;
6use std::io::Write;
7
8impl<W: Write> Context<W> for Value {
9    fn truthy(&self, path: Path) -> bool {
10        use self::Value::*;
11
12        let mut value = self;
13
14        for part in path.parts() {
15            if let Some(next_value) = value.get(part) {
16                value = next_value;
17            } else {
18                return false;
19            }
20        }
21
22        match *value {
23            String(ref s) => s.len() > 0,
24            Integer(n) => n != 0,
25            Float(n) => n != 0.0,
26            Boolean(b) => b,
27            Datetime(_) | Array(_) | Table(_) => true,
28        }
29    }
30
31    fn inject(&self, path: Path, sink: &mut W) -> Result<()> {
32        use self::Value::*;
33
34        let mut value = self;
35
36        for part in path.parts() {
37            if let Some(next_value) = value.get(part) {
38                value = next_value;
39            } else {
40                return Err(Error::Undefined(path.to_owned()));
41            }
42        }
43
44        match *value {
45            String(ref s) => {
46                s.inject(Path::new(""), sink)?;
47            }
48
49            Integer(n) => {
50                write!(sink, "{}", n)?;
51            }
52
53            Float(n) => {
54                write!(sink, "{}", n)?;
55            }
56
57            Boolean(b) => {
58                sink.write_all(if b { b"true" } else { b"false" })?;
59            }
60
61            Datetime(ref date) => {
62                write!(sink, "{}", date)?;
63            }
64
65            Array(_) | Table(_) => {
66                return Err(Error::NotInjectable(path.to_owned()));
67            }
68        }
69
70        Ok(())
71    }
72
73    fn iterate(&self, path: Path, mut chomp: Chomp<W>) -> Result<()> {
74        let mut value = self;
75
76        for part in path.parts() {
77            if let Some(next_value) = value.get(part) {
78                value = next_value;
79            } else {
80                return Err(Error::Undefined(path.to_owned()));
81            }
82        }
83
84        if let &Value::Array(ref array) = value {
85            for value in array {
86                chomp.chomp(value)?;
87            }
88            Ok(())
89        } else {
90            Err(Error::NotIterable(path.to_owned()))
91        }
92    }
93}