summaryrefslogtreecommitdiff
path: root/src/compwrapper.rs
blob: 8028b4921a16a7b5c4987b5d017a695b8732cb13 (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 specs::{Builder, EntityBuilder};
use serde_json::Value;
use super::components::{Visible, Blocking, Played};


#[derive(Clone)]
pub enum CompWrapper{
	Visible(Visible),
	Blocking(Blocking),
	Player(Played)
}

impl CompWrapper {

	pub fn build<'a>(&self, builder: specs::EntityBuilder<'a>) -> specs::EntityBuilder<'a> {
		match self.clone() {
			Self::Visible(c) => builder.with(c),
			Self::Blocking(c) => builder.with(c),
			Self::Player(c) => builder.with(c)
		}
	}
	
	pub fn parse_component(data: Value) -> Option<CompWrapper> {
		let a = data.as_array()?;
		if a.len() != 2 {
			return None
		}
		let typename = a[0].as_str()?;
		let params: HashMap<&str, &Value> = a[1].as_object()?.into_iter().map(|(key, val)| (key.as_str(), val)).collect();
		Self::load_component(typename, params)
	}

	pub fn load_component(typename: &str, mut parameters: HashMap<&str, &Value>) -> Option<CompWrapper> {
		match typename {
			"Visible" => Some(CompWrapper::Visible(Visible{
				sprite: parameters.remove("sprite")?.as_str()?.to_string(),
				height: parameters.remove("height")?.as_f64()?
			})),
			"Blocking" => Some(CompWrapper::Blocking(Blocking)),
			"Player" => Some(CompWrapper::Player(Played::new(
				parameters.remove("name")?.as_str()?.to_string()
			))),
			_ => None
		}
	}
}