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