From 323cd679cd29a8475c3b7486ce54ecd37620dbea Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 4 Feb 2020 22:23:17 +0100 Subject: tried to implement deserialisation of entities --- src/template.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/template.rs (limited to 'src/template.rs') diff --git a/src/template.rs b/src/template.rs new file mode 100644 index 0000000..d6f5c81 --- /dev/null +++ b/src/template.rs @@ -0,0 +1,48 @@ + +use std::collections::HashMap; +use serde_json::Value; +use super::compwrapper::CompWrapper; + +pub struct Template { + pub arguments: Vec, + pub components: Vec<(String, HashMap)> +} + +impl Template { + pub fn instantiate(&self, args: Vec, kwargs: HashMap) -> Option>{ + let mut components: Vec = Vec::new(); + for (compname, compparams) in &self.components { + let mut compargs: HashMap<&str, &Value> = HashMap::new(); + for (name, param) in compparams { + match param { + CompParam::Constant(val) => {compargs.insert(name.as_str(), &val); Some(())}, + CompParam::Argument(argname) => { + if let Some(argval) = kwargs.get(argname.as_str()) { + compargs.insert(name.as_str(), argval); + Some(()) + } else if let Some(idx) = self.arguments.iter().position(|x| x == name){ + if idx < args.len() { + compargs.insert(name.as_str(), &args[idx]); + Some(()) + } else { + println!("positional argument out of range"); + None + } + } else { + println!("can't find parameter value, compname: {}, name: {}, argname: {}", compname, name, argname); + None + } + } + }?; + } + components.push(CompWrapper::load_component(compname.as_str(), compargs)?); + } + Some(components) + } +} + + +pub enum CompParam { + Constant(Value), + Argument(String) +} -- cgit