summaryrefslogtreecommitdiff
path: root/src/template.rs
blob: 5e52cc0ab3d48f0d392f886a7c5cbc8a05db279b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

use std::collections::HashMap;
use crate::parameter::Parameter;
use crate::compwrapper::CompWrapper;

pub struct Template {
	pub arguments: Vec<String>,
	pub components: Vec<(String, HashMap<String, CompParam>)>
}

impl Template {
	pub fn instantiate(&self, args: Vec<Parameter>, kwargs: HashMap<String, Parameter>) -> Option<Vec<CompWrapper>>{
		let mut components: Vec<CompWrapper> = Vec::new();
		for (compname, compparams) in &self.components {
			let mut compargs: HashMap<&str, &Parameter> = 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(Parameter),
	Argument(String)
}