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
49
50
51
52
53
54
55
56
//! # ksl::builtin::get
//!
//! Built-in function `Get`.
use crate::{Environment, eval::apply::eval_apply, value::Value};
pub(crate) fn builtin(args: &[Value], env: &Environment) -> Option<(Value, Environment)> {
if let [object, key] = &args[..] {
match (eval_apply(object, env), eval_apply(key, env)) {
(Some((Value::Object(_, dict), _)), Some((Value::String(k), _))) => {
if let Some(val) = dict.get(&k) {
Some((val.clone(), Environment::new()))
} else {
eprintln!(
concat!(
"Error[ksl::builtin::get]: ",
"Object doesn't have key `{}`.",
),
k
);
None
}
}
(Some((e1, _)), Some((e2, _))) => {
eprintln!(
concat!(
"Error[ksl::builtin::get]: ",
"Only accepts an object and a string, ",
"but {:?} was passed."
),
(e1, e2)
);
None
}
_ => {
eprintln!(
concat!(
"Error[ksl::builtin::get]: ",
"Cannot evaluate expression {:?}."
),
(object, key)
);
None
}
}
} else {
eprintln!(
concat!(
"Error[ksl::builtin::get]: ",
"Only accepts 2 arguments, but {} were passed."
),
args.len()
);
None
}
}