diff options
Diffstat (limited to 'src/file/yaml.rs')
-rw-r--r-- | src/file/yaml.rs | 101 |
1 files changed, 0 insertions, 101 deletions
diff --git a/src/file/yaml.rs b/src/file/yaml.rs deleted file mode 100644 index 95a64b4..0000000 --- a/src/file/yaml.rs +++ /dev/null @@ -1,101 +0,0 @@ -use yaml_rust as yaml; - -use source::Source; -use std::error::Error; -use std::fmt; -use std::collections::{BTreeMap, HashMap}; -use std::mem; -use value::Value; - -pub struct Content { - // Root table of the YAML document - root: yaml::Yaml, -} - -impl Content { - pub fn parse(text: &str, namespace: Option<&String>) -> Result<Box<Source + Send + Sync>, Box<Error>> { - let mut docs = yaml::YamlLoader::load_from_str(text)?; - - // Designate root - let mut root = match docs.len() { - 0 => yaml::Yaml::Hash(BTreeMap::new()), - 1 => mem::replace(&mut docs[0], yaml::Yaml::Null), - n => { - return Err(Box::new(MultipleDocumentsError(n))); - } - }; - - // Limit to namespace - if let Some(namespace) = namespace { - if let yaml::Yaml::Hash(mut root_map) = root { - if let Some(value) = root_map.remove(&yaml::Yaml::String(namespace.clone())) { - root = value; - } else { - // TODO: Warn? - root = yaml::Yaml::Hash(BTreeMap::new()); - } - } - } - - Ok(Box::new(Content { root: root })) - } - - pub fn from_yaml(doc: yaml::Yaml) -> Content { - Content { root: doc } - } -} - -fn from_yaml_value<'a>(value: &yaml::Yaml) -> Value { - match *value { - yaml::Yaml::String(ref value) => Value::String(value.clone()), - yaml::Yaml::Real(ref value) => Value::Float(value.parse::<f64>().unwrap()), - yaml::Yaml::Integer(value) => Value::Integer(value), - yaml::Yaml::Boolean(value) => Value::Boolean(value), - yaml::Yaml::Hash(ref table) => { - let mut m = HashMap::new(); - for (key, value) in table { - if let Some(k) = key.as_str() { - m.insert(k.to_owned(), from_yaml_value(value)); - } - // TODO: should we do anything for non-string keys? - } - Value::Table(m) - } - yaml::Yaml::Array(ref array) => { - let l: Vec<Value> = array.iter().map(from_yaml_value).collect(); - Value::Array(l) - } - // TODO: how should we handle Null and BadValue? - _ => { - unimplemented!(); - } - - } -} - -impl Source for Content { - fn collect(&self) -> HashMap<String, Value> { - if let Value::Table(table) = from_yaml_value(&self.root) { - table - } else { - // TODO: Better handle a non-object at root - // NOTE: I never want to support that but a panic is bad - panic!("expected object at YAML root"); - } - } -} - -#[derive(Debug, Copy, Clone)] -struct MultipleDocumentsError(usize); - -impl fmt::Display for MultipleDocumentsError { - fn fmt(&self, format: &mut fmt::Formatter) -> fmt::Result { - write!(format, "Got {} YAML documents, expected 1", self.0) - } -} - -impl Error for MultipleDocumentsError { - fn description(&self) -> &str { - "More than one YAML document provided" - } -} |