From ff544527663f25af8d1ddee4ea5ef13fa12bd894 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 20 Feb 2019 19:43:56 -0600 Subject: [PATCH] FEATURE: Support including toml documents --- src/convert/mod.rs | 1 + src/convert/toml.rs | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/convert/mod.rs b/src/convert/mod.rs index bf00ba7..e267a66 100644 --- a/src/convert/mod.rs +++ b/src/convert/mod.rs @@ -94,6 +94,7 @@ impl ImporterRegistry { ); registry.register("json", Box::new(json::JsonConverter {})); registry.register("yaml", Box::new(yaml::YamlConverter {})); + registry.register("toml", Box::new(toml::TomlConverter {})); registry } diff --git a/src/convert/toml.rs b/src/convert/toml.rs index 70796b6..85fc309 100644 --- a/src/convert/toml.rs +++ b/src/convert/toml.rs @@ -14,6 +14,7 @@ use std; use std::error; +use std::error::Error; use std::io::Write; use std::rc::Rc; @@ -21,7 +22,7 @@ use simple_error::SimpleError; use toml; use crate::build::Val; -use crate::convert::traits::{ConvertResult, Converter}; +use crate::convert::traits::{ConvertResult, Converter, ImportResult, Importer}; pub struct TomlConverter {} @@ -83,6 +84,30 @@ impl TomlConverter { Ok(toml_val) } + fn convert_toml_val(&self, v: &toml::Value) -> std::result::Result> { + Ok(match v { + toml::Value::String(s) => Val::Str(s.clone()), + toml::Value::Integer(i) => Val::Int(*i), + toml::Value::Float(f) => Val::Float(*f), + toml::Value::Boolean(b) => Val::Boolean(*b), + toml::Value::Array(l) => { + let mut vs = Vec::with_capacity(l.len()); + for aval in l { + vs.push(Rc::new(self.convert_toml_val(aval)?)); + } + Val::List(vs) + } + toml::Value::Table(m) => { + let mut fs = Vec::with_capacity(m.len()); + for (key, value) in m { + fs.push((key.to_string(), Rc::new(self.convert_toml_val(value)?))); + } + Val::Tuple(fs) + } + toml::Value::Datetime(d) => Val::Str(format!("{}", d)), + }) + } + fn write(&self, v: &Val, w: &mut Write) -> ConvertResult { let toml_val = self.convert_value(v)?; let toml_bytes = toml::ser::to_string_pretty(&toml_val)?; @@ -104,3 +129,10 @@ impl Converter for TomlConverter { "Convert ucg Vals into valid ucg.".to_string() } } + +impl Importer for TomlConverter { + fn import(&self, bytes: &[u8]) -> ImportResult { + let json_val = toml::from_slice(bytes)?; + Ok(Rc::new(self.convert_toml_val(&json_val)?)) + } +}