1use std::collections::HashMap;
2use std::rc::Rc;
3
4use crate::nan_value::{Arena, NanValue};
5use crate::value::{RuntimeError, Value};
6use aver_rt::AverList;
7
8pub fn register(global: &mut HashMap<String, Value>) {
13 let mut members = HashMap::new();
14 members.insert("get".to_string(), Value::Builtin("Args.get".to_string()));
15 global.insert(
16 "Args".to_string(),
17 Value::Namespace {
18 name: "Args".to_string(),
19 members,
20 },
21 );
22}
23
24pub fn effects(name: &str) -> &'static [&'static str] {
25 match name {
26 "Args.get" => &["Args.get"],
27 _ => &[],
28 }
29}
30
31pub fn call(
32 name: &str,
33 args: &[Value],
34 cli_args: &[String],
35) -> Option<Result<Value, RuntimeError>> {
36 match name {
37 "Args.get" => Some(get_args(args, cli_args)),
38 _ => None,
39 }
40}
41
42fn get_args(args: &[Value], cli_args: &[String]) -> Result<Value, RuntimeError> {
43 if !args.is_empty() {
44 return Err(RuntimeError::Error(format!(
45 "Args.get() takes 0 arguments, got {}",
46 args.len()
47 )));
48 }
49 let list_vals: Vec<Value> = cli_args.iter().map(|s| Value::Str(s.clone())).collect();
50 Ok(Value::List(AverList::from_vec(list_vals)))
51}
52
53pub fn register_nv(global: &mut HashMap<String, NanValue>, arena: &mut Arena) {
56 let idx = arena.push_builtin("Args.get");
57 let members: Vec<(Rc<str>, NanValue)> = vec![(Rc::from("get"), NanValue::new_builtin(idx))];
58 let ns_idx = arena.push(crate::nan_value::ArenaEntry::Namespace {
59 name: Rc::from("Args"),
60 members,
61 });
62 global.insert("Args".to_string(), NanValue::new_namespace(ns_idx));
63}
64
65pub fn call_nv(
66 name: &str,
67 args: &[NanValue],
68 cli_args: &[String],
69 arena: &mut Arena,
70) -> Option<Result<NanValue, RuntimeError>> {
71 match name {
72 "Args.get" => Some(get_args_nv(args, cli_args, arena)),
73 _ => None,
74 }
75}
76
77fn get_args_nv(
78 args: &[NanValue],
79 cli_args: &[String],
80 arena: &mut Arena,
81) -> Result<NanValue, RuntimeError> {
82 if !args.is_empty() {
83 return Err(RuntimeError::Error(format!(
84 "Args.get() takes 0 arguments, got {}",
85 args.len()
86 )));
87 }
88 let items: Vec<NanValue> = cli_args
89 .iter()
90 .map(|s| NanValue::new_string_value(s, arena))
91 .collect();
92 let list_idx = arena.push_list(items);
93 Ok(NanValue::new_list(list_idx))
94}