lovm2_std/
lib.rs

1pub(crate) mod buffer;
2pub(crate) mod collection;
3pub(crate) mod data;
4pub(crate) mod fs;
5pub(crate) mod functional;
6pub(crate) mod json;
7pub(crate) mod math;
8#[cfg(feature = "net")]
9pub(crate) mod net;
10pub(crate) mod regex;
11pub(crate) mod string;
12
13pub use self::buffer::*;
14pub use self::collection::*;
15pub use self::data::*;
16pub use self::fs::*;
17pub use self::functional::*;
18pub use self::json::*;
19pub use self::math::*;
20#[cfg(feature = "net")]
21pub use self::net::*;
22pub use self::regex::*;
23pub use self::string::*;
24
25use lovm2_core::extend::prelude::*;
26
27macro_rules! add_function {
28    ($module:expr, $name:ident) => {
29        $module
30            .slots
31            .insert(stringify!($name), create_callable($name))
32    };
33}
34
35/// Add standard functions to the given vm. If `create_vm_with_std` is used, this
36/// gets loaded automatically.
37pub fn create_std_module() -> Module {
38    let module = ModuleBuilder::with_meta(ModuleMeta::new("std".to_string(), None, vec![]));
39    let mut module = module.build().unwrap();
40
41    add_function!(module, absolute);
42    add_function!(module, acos);
43    add_function!(module, all);
44    add_function!(module, any);
45    add_function!(module, append);
46    add_function!(module, argn);
47    add_function!(module, asin);
48    add_function!(module, atan);
49    add_function!(module, atan2);
50    add_function!(module, basename);
51    add_function!(module, call);
52    add_function!(module, captures);
53    add_function!(module, ceil);
54    add_function!(module, chr);
55    add_function!(module, clamp);
56    add_function!(module, contains);
57    add_function!(module, cos);
58    add_function!(module, create_file);
59    add_function!(module, decode);
60    add_function!(module, deep_clone);
61    add_function!(module, delete);
62    add_function!(module, e);
63    add_function!(module, encode);
64    add_function!(module, exists);
65    add_function!(module, filter);
66    add_function!(module, floor);
67    add_function!(module, format);
68    add_function!(module, get);
69    add_function!(module, has_data);
70    add_function!(module, index_of);
71    add_function!(module, input);
72    add_function!(module, is_dir);
73    add_function!(module, is_match);
74    add_function!(module, join);
75    add_function!(module, len);
76    add_function!(module, list_dir);
77    add_function!(module, log);
78    add_function!(module, map);
79    add_function!(module, mkdir);
80    add_function!(module, new_buffer);
81    add_function!(module, new_regex);
82    add_function!(module, open_file);
83    add_function!(module, ord);
84    add_function!(module, parent);
85    add_function!(module, pi);
86    add_function!(module, pop_vstack);
87    add_function!(module, print);
88    add_function!(module, push_vstack);
89    add_function!(module, read_all);
90    add_function!(module, read_line);
91    add_function!(module, readn);
92    add_function!(module, rename);
93    add_function!(module, replace);
94    add_function!(module, rmdir);
95    add_function!(module, round);
96    add_function!(module, set);
97    add_function!(module, sin);
98    add_function!(module, sort);
99    add_function!(module, split);
100    add_function!(module, sqrt);
101    add_function!(module, tan);
102    add_function!(module, to_lower);
103    add_function!(module, to_upper);
104    add_function!(module, trim);
105    add_function!(module, unlink);
106    add_function!(module, write_all);
107    add_function!(module, writes);
108
109    if cfg!(feature = "net") {
110        add_function!(module, exec);
111        add_function!(module, get_body_as_buffer);
112        add_function!(module, get_body_as_string);
113        add_function!(module, get_url);
114        add_function!(module, get_status);
115        add_function!(module, new_request);
116        add_function!(module, serve);
117        add_function!(module, set_body);
118        add_function!(module, set_header);
119        add_function!(module, set_method);
120    }
121
122    module
123}
124
125pub fn input(vm: &mut Vm) -> Lovm2Result<()> {
126    use std::io::stdin;
127
128    let mut input = String::new();
129    stdin().read_line(&mut input).unwrap();
130
131    vm.context_mut().push_value(Value::Str(input));
132
133    Ok(())
134}
135
136#[lovm2_function]
137fn len(val: &Value) -> Lovm2Result<i64> {
138    val.as_any_inner()
139        .and_then(|any| {
140            if let Some(buf) = any.borrow().0.downcast_ref::<Buffer>() {
141                return Ok(buf.inner.len() as i64);
142            }
143
144            if let Some(file) = any.borrow().0.downcast_ref::<File>() {
145                let meta = file.inner.metadata().or_else(err_from_string)?;
146                return Ok(meta.len() as i64);
147            }
148
149            err_method_not_supported("count")
150        })
151        .or_else(|_| val.len().map(|n| n as i64))
152}
153
154pub fn print(vm: &mut Vm) -> Lovm2Result<()> {
155    use std::io::Write;
156
157    let argn = vm.context_mut().frame_mut().unwrap().argn;
158    let mut args: Vec<String> = (0..argn)
159        .map(|_| vm.context_mut().pop_value().unwrap())
160        .map(|x| format!("{}", x))
161        .collect();
162
163    args.reverse();
164
165    print!("{}", args.join(" "));
166    std::io::stdout().flush().unwrap();
167    vm.context_mut().push_value(Value::Nil);
168
169    Ok(())
170}