-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathget.rs
32 lines (29 loc) · 941 Bytes
/
get.rs
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
use crate::ifn::IFn;
use crate::persistent_list_map::IPersistentMap;
use crate::value::{ToValue, Value};
use std::rc::Rc;
// General assoc fn; however, currently just implemented
// for our one map type, PersistentListMap
#[derive(Debug, Clone)]
pub struct GetFn {}
impl ToValue for GetFn {
fn to_value(&self) -> Value {
Value::IFn(Rc::new(self.clone()))
}
}
impl IFn for GetFn {
fn invoke(&self, args: Vec<Rc<Value>>) -> Value {
if args.len() != 2 {
return Value::Condition(format!(
"Wrong number of arguments given to function (Given: {}, Expected: 2)",
args.len()
));
}
if let Value::PersistentListMap(pmap) = &*(args.get(0).unwrap().clone()) {
let key = args.get(1).unwrap();
return pmap.get(key).to_value();
}
// @TODO add error in here with erkk's new error tools
Value::Nil
}
}