From 70db58f688f0dbdd69231da570cf8dbb54e5ca81 Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 7 Feb 2020 14:08:18 +0100 Subject: named stuff properly; added encyclopedia and template --- src/encyclopedia.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/encyclopedia.rs (limited to 'src/encyclopedia.rs') diff --git a/src/encyclopedia.rs b/src/encyclopedia.rs new file mode 100644 index 0000000..17e9857 --- /dev/null +++ b/src/encyclopedia.rs @@ -0,0 +1,41 @@ + +use std::collections::HashMap; +use serde_json::Value; +use crate::assemblage::Assemblage; +use crate::componentwrapper::ComponentWrapper; +use crate::template::Template; + +#[derive(Default)] +pub struct Encyclopedia { + items: HashMap +} + +impl Encyclopedia { + + pub fn new() -> Encyclopedia { + Encyclopedia { + items: HashMap::new() + } + } + + pub fn from_json(val: Value) -> Result { + let mut items = HashMap::new(); + for (k, v) in val.as_object().ok_or("encyclopedia not a json object")?.into_iter() { + items.insert(k.clone(), Assemblage::from_json(v)?); + } + Ok(Encyclopedia{items}) + } + + pub fn add_assemblage(&mut self, name: &str, assemblage: Assemblage) -> Result<(), &'static str> { + //todo: what if name exists + self.items.insert(name.to_string(), assemblage); + Ok(()) + } + + pub fn construct(&self, template: &Template) -> Result, &str> { + let assemblage = self.items.get(&template.name).ok_or("unknown assemblage name")?; + assemblage.instantiate(&template.args, &template.kwargs) + } + +} + -- cgit