summaryrefslogtreecommitdiff
path: root/src/components/interactable.rs
blob: a59cc904ac9b7263a2fc493b5e3e9e46d1e830e8 (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

use serde_json::{Value};
use specs::{
	Component,
	HashMapStorage
};
use crate::{
	Template
};

#[derive(Component, Debug, Clone, PartialEq)]
#[storage(HashMapStorage)]
pub enum Interactable {
	Harvest,
	Change(Template),
	Say(String),
	Reply(String)
}

use Interactable::*;

impl Interactable {
	pub fn from_json(val: &Value) -> Option<Self> {
		let typ = if val.is_string() {val} else {val.get(0)?};
		let arg = if val.is_string() {&Value::Null} else {val.get(1)?};
		Some(match typ.as_str()? {
			"harvest" => Harvest,
			"change" => Change(Template::from_json(arg).ok()?),
			"say" => Say(arg.as_str()?.to_string()),
			"reply" => Reply(arg.as_str()?.to_string()),
			_ => None?
		})
	}
	
	pub fn accepts_arg(&self, arg: &Option<String>) -> bool {
		match self {
			Harvest => arg.is_none(),
			Change(_) => arg.is_none(),
			Say(_) => arg.is_none(),
			Reply(_) => arg.is_some(),
		}
	}
}