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