1 #[derive(Copy, Clone)]
2 pub struct Decoder;
3 
4 impl toml_test_harness::Decoder for Decoder {
name(&self) -> &str5     fn name(&self) -> &str {
6         "toml_edit"
7     }
8 
decode(&self, data: &[u8]) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>9     fn decode(&self, data: &[u8]) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
10         let data = std::str::from_utf8(data).map_err(toml_test_harness::Error::new)?;
11         let document = data
12             .parse::<toml_edit::Document>()
13             .map_err(toml_test_harness::Error::new)?;
14         document_to_decoded(&document)
15     }
16 }
17 
document_to_decoded( value: &toml_edit::Document, ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>18 fn document_to_decoded(
19     value: &toml_edit::Document,
20 ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
21     table_to_decoded(value)
22 }
23 
item_to_decoded( value: &toml_edit::Item, ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>24 fn item_to_decoded(
25     value: &toml_edit::Item,
26 ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
27     match value {
28         toml_edit::Item::None => unreachable!("No nones"),
29         toml_edit::Item::Value(v) => value_to_decoded(v),
30         toml_edit::Item::Table(v) => table_to_decoded(v),
31         toml_edit::Item::ArrayOfTables(v) => {
32             let v: Result<_, toml_test_harness::Error> = v.iter().map(table_to_decoded).collect();
33             Ok(toml_test_harness::Decoded::Array(v?))
34         }
35     }
36 }
37 
value_to_decoded( value: &toml_edit::Value, ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>38 fn value_to_decoded(
39     value: &toml_edit::Value,
40 ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
41     match value {
42         toml_edit::Value::Integer(v) => Ok(toml_test_harness::Decoded::Value(
43             toml_test_harness::DecodedValue::from(*v.value()),
44         )),
45         toml_edit::Value::String(v) => Ok(toml_test_harness::Decoded::Value(
46             toml_test_harness::DecodedValue::from(v.value()),
47         )),
48         toml_edit::Value::Float(v) => Ok(toml_test_harness::Decoded::Value(
49             toml_test_harness::DecodedValue::from(*v.value()),
50         )),
51         toml_edit::Value::Datetime(v) => {
52             let v = v.value();
53             let value = v.to_string();
54             let value = match (v.date.is_some(), v.time.is_some(), v.offset.is_some()) {
55                 (true, true, true) => toml_test_harness::DecodedValue::Datetime(value),
56                 (true, true, false) => toml_test_harness::DecodedValue::DatetimeLocal(value),
57                 (true, false, false) => toml_test_harness::DecodedValue::DateLocal(value),
58                 (false, true, false) => toml_test_harness::DecodedValue::TimeLocal(value),
59                 _ => unreachable!("Unsupported case"),
60             };
61             Ok(toml_test_harness::Decoded::Value(value))
62         }
63         toml_edit::Value::Boolean(v) => Ok(toml_test_harness::Decoded::Value(
64             toml_test_harness::DecodedValue::from(*v.value()),
65         )),
66         toml_edit::Value::Array(v) => {
67             let v: Result<_, toml_test_harness::Error> = v.iter().map(value_to_decoded).collect();
68             Ok(toml_test_harness::Decoded::Array(v?))
69         }
70         toml_edit::Value::InlineTable(v) => inline_table_to_decoded(v),
71     }
72 }
73 
table_to_decoded( value: &toml_edit::Table, ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>74 fn table_to_decoded(
75     value: &toml_edit::Table,
76 ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
77     let table: Result<_, toml_test_harness::Error> = value
78         .iter()
79         .map(|(k, v)| {
80             let k = k.to_owned();
81             let v = item_to_decoded(v)?;
82             Ok((k, v))
83         })
84         .collect();
85     Ok(toml_test_harness::Decoded::Table(table?))
86 }
87 
inline_table_to_decoded( value: &toml_edit::InlineTable, ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error>88 fn inline_table_to_decoded(
89     value: &toml_edit::InlineTable,
90 ) -> Result<toml_test_harness::Decoded, toml_test_harness::Error> {
91     let table: Result<_, toml_test_harness::Error> = value
92         .iter()
93         .map(|(k, v)| {
94             let k = k.to_owned();
95             let v = value_to_decoded(v)?;
96             Ok((k, v))
97         })
98         .collect();
99     Ok(toml_test_harness::Decoded::Table(table?))
100 }
101