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}