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
35pub 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}