From: Ian Jackson Date: Wed, 18 Nov 2020 11:26:56 +0000 (+0000) Subject: wip toml, seems to work a bit X-Git-Tag: otter-0.2.0~494 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=9d119fa9d7aa08a8e85ba82c7d3412c869a32591;p=otter.git wip toml, seems to work a bit Signed-off-by: Ian Jackson --- diff --git a/src/toml.rs b/src/toml.rs index ffe4efbc..cb247e01 100644 --- a/src/toml.rs +++ b/src/toml.rs @@ -23,7 +23,7 @@ pub enum Error { #[error("deserialize failed (improper TOML structure?): {0}")] Custom(Box), #[error("config file has invalid TOML syntax: {0}")] - TomlSyntax(#[from] toml::de::Error), + TomlSyntax(toml::de::Error), } impl serde::de::Error for Error { @@ -150,20 +150,21 @@ impl<'de> Deserializer<'de> for TomlDe<'de> { } #[throws(Error)] fn deserialize_enum> - (self, _:&str, _:&[&str], v: V) -> V::Value + (self, _:&str, _:&[&str], vi: V) -> V::Value { type TV = toml::Value; match &self.0 { - TV::String(s) => return v.visit_enum(s.as_str().into_deserializer()), + TV::String(s) => return vi.visit_enum(s.as_str().into_deserializer())?, TV::Table(s) => if_chain! { + let mut s = s.iter(); if let Some((k, v)) = s.next(); if let None = s.next(); - then { return v.visit_enum(EA { k, v })? } + then { return vi.visit_enum(EA { k, v }) } }, _ => {}, } // hopefully the format will figure it out, or produce an error - visit(v, &self.0)? + visit(vi, &self.0)? } forward_to_deserialize_any! { bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string @@ -181,7 +182,7 @@ pub fn from_value<'de, T: Deserialize<'de>> (tv: &'de toml::Value) -> T #[throws(Error)] pub fn from_str (s: &str) -> T { - let tv : toml::Value = s.parse()?; + let tv : toml::Value = s.parse().map_err(Error::TomlSyntax)?; dbg!(&tv); from_value(&tv)? }