Skip to main content

aver/services/
args.rs

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
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 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
53// ─── NanValue-native API ─────────────────────────────────────────────────────
54
55pub 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}