Import toml 0.7.3
[platform/upstream/rust-toml.git] / tests / encoder.rs
1 #![cfg(all(feature = "parse", feature = "display"))]
2
3 #[derive(Copy, Clone)]
4 pub struct Encoder;
5
6 impl toml_test_harness::Encoder for Encoder {
7     fn name(&self) -> &str {
8         "toml"
9     }
10
11     fn encode(&self, data: toml_test_harness::Decoded) -> Result<String, toml_test_harness::Error> {
12         let value = from_decoded(&data)?;
13         let s = toml::to_string(&value).map_err(toml_test_harness::Error::new)?;
14         Ok(s)
15     }
16 }
17
18 fn from_decoded(
19     decoded: &toml_test_harness::Decoded,
20 ) -> Result<toml::Value, toml_test_harness::Error> {
21     let value = match decoded {
22         toml_test_harness::Decoded::Value(value) => from_decoded_value(value)?,
23         toml_test_harness::Decoded::Table(value) => toml::Value::Table(from_table(value)?),
24         toml_test_harness::Decoded::Array(value) => toml::Value::Array(from_array(value)?),
25     };
26     Ok(value)
27 }
28
29 fn from_decoded_value(
30     decoded: &toml_test_harness::DecodedValue,
31 ) -> Result<toml::Value, toml_test_harness::Error> {
32     match decoded {
33         toml_test_harness::DecodedValue::String(value) => Ok(toml::Value::String(value.clone())),
34         toml_test_harness::DecodedValue::Integer(value) => value
35             .parse::<i64>()
36             .map_err(toml_test_harness::Error::new)
37             .map(toml::Value::Integer),
38         toml_test_harness::DecodedValue::Float(value) => value
39             .parse::<f64>()
40             .map_err(toml_test_harness::Error::new)
41             .map(toml::Value::Float),
42         toml_test_harness::DecodedValue::Bool(value) => value
43             .parse::<bool>()
44             .map_err(toml_test_harness::Error::new)
45             .map(toml::Value::Boolean),
46         toml_test_harness::DecodedValue::Datetime(value) => value
47             .parse::<toml::value::Datetime>()
48             .map_err(toml_test_harness::Error::new)
49             .map(toml::Value::Datetime),
50         toml_test_harness::DecodedValue::DatetimeLocal(value) => value
51             .parse::<toml::value::Datetime>()
52             .map_err(toml_test_harness::Error::new)
53             .map(toml::Value::Datetime),
54         toml_test_harness::DecodedValue::DateLocal(value) => value
55             .parse::<toml::value::Datetime>()
56             .map_err(toml_test_harness::Error::new)
57             .map(toml::Value::Datetime),
58         toml_test_harness::DecodedValue::TimeLocal(value) => value
59             .parse::<toml::value::Datetime>()
60             .map_err(toml_test_harness::Error::new)
61             .map(toml::Value::Datetime),
62     }
63 }
64
65 fn from_table(
66     decoded: &std::collections::HashMap<String, toml_test_harness::Decoded>,
67 ) -> Result<toml::value::Table, toml_test_harness::Error> {
68     decoded
69         .iter()
70         .map(|(k, v)| {
71             let v = from_decoded(v)?;
72             Ok((k.to_owned(), v))
73         })
74         .collect()
75 }
76
77 fn from_array(
78     decoded: &[toml_test_harness::Decoded],
79 ) -> Result<toml::value::Array, toml_test_harness::Error> {
80     decoded.iter().map(from_decoded).collect()
81 }