Skip to main content

aver/services/
args.rs

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
8/// Args service — command-line arguments.
9///
10/// Methods:
11///   Args.get() → List<String>   ! [Args.get]
12pub 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
55// ─── NanValue-native API ─────────────────────────────────────────────────────
56
57pub 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}