1 #![cfg(all(feature = "parse", feature = "display"))]
2 
3 #[derive(Copy, Clone)]
4 pub struct Decoder;
5 
6 impl toml_test_harness::Decoder for Decoder {
name(&self) -> &str7     fn name(&self) -> &str {
8         "toml"
9     }
10 
decode(&self, data: &[u8]) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>11     fn decode(&self, data: &[u8]) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
12         let data = std::str::from_utf8(data).map_err(toml_test_harness::Error::new)?;
13         let document = data
14             .parse::<toml::Table>()
15             .map_err(toml_test_harness::Error::new)?;
16         let value = toml::Value::Table(document);
17         value_to_decoded(&value)
18     }
19 }
20 
value_to_decoded( value: &toml::Value, ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>21 fn value_to_decoded(
22     value: &toml::Value,
23 ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
24     match value {
25         toml::Value::Integer(v) => Ok(toml_test_harness::Decoded::Value(
26             toml_test_harness::DecodedValue::from(*v),
27         )),
28         toml::Value::String(v) => Ok(toml_test_harness::Decoded::Value(
29             toml_test_harness::DecodedValue::from(v),
30         )),
31         toml::Value::Float(v) => Ok(toml_test_harness::Decoded::Value(
32             toml_test_harness::DecodedValue::from(*v),
33         )),
34         toml::Value::Datetime(v) => {
35             let value = v.to_string();
36             let value = match (v.date.is_some(), v.time.is_some(), v.offset.is_some()) {
37                 (true, true, true) => toml_test_harness::DecodedValue::Datetime(value),
38                 (true, true, false) => toml_test_harness::DecodedValue::DatetimeLocal(value),
39                 (true, false, false) => toml_test_harness::DecodedValue::DateLocal(value),
40                 (false, true, false) => toml_test_harness::DecodedValue::TimeLocal(value),
41                 _ => unreachable!("Unsupported case"),
42             };
43             Ok(toml_test_harness::Decoded::Value(value))
44         }
45         toml::Value::Boolean(v) => Ok(toml_test_harness::Decoded::Value(
46             toml_test_harness::DecodedValue::from(*v),
47         )),
48         toml::Value::Array(v) => {
49             let v: Result<_, toml_test_harness::Error> = v.iter().map(value_to_decoded).collect();
50             Ok(toml_test_harness::Decoded::Array(v?))
51         }
52         toml::Value::Table(v) => table_to_decoded(v),
53     }
54 }
55 
table_to_decoded( value: &toml::value::Table, ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>56 fn table_to_decoded(
57     value: &toml::value::Table,
58 ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
59     let table: Result<_, toml_test_harness::Error> = value
60         .iter()
61         .map(|(k, v)| {
62             let k = k.to_owned();
63             let v = value_to_decoded(v)?;
64             Ok((k, v))
65         })
66         .collect();
67     Ok(toml_test_harness::Decoded::Table(table?))
68 }
69