Skip to main content

mumustring/
lib.rs

1mod common;
2pub mod unary;
3pub mod partial;
4mod multi;
5
6use mumu::{
7    parser::interpreter::Interpreter,
8    parser::types::{Value, FunctionValue},
9};
10use std::sync::{Arc, Mutex};
11
12#[no_mangle]
13pub unsafe extern "C" fn Cargo_lock(
14    interp_ptr: *mut std::ffi::c_void,
15    _extra_str: *const std::ffi::c_void,
16) -> i32 {
17    let interp = &mut *(interp_ptr as *mut Interpreter);
18
19    macro_rules! reg {
20        ($name:expr, $f:expr) => {{
21            let func = Arc::new(Mutex::new($f));
22            interp.register_dynamic_function($name, func);
23            interp.set_variable($name, Value::Function(Box::new(FunctionValue::Named($name.into()))));
24        }};
25    }
26
27    // Unary functions
28    reg!("string:lower", unary::string_lower_bridge);
29    reg!("string:upper", unary::string_upper_bridge);
30    reg!("string:length", unary::string_length_bridge);
31    reg!("string:to_string", unary::string_to_string_bridge);
32    reg!("string:trim", unary::string_trim_bridge);
33
34    // Partial/multi-arg functions
35    reg!("string:concat", partial::string_concat_bridge);
36    reg!("string:split", partial::string_split_bridge);
37    reg!("string:join", partial::string_join_bridge);
38    reg!("string:replace", partial::string_replace_bridge);
39    reg!("string:contains", partial::string_contains_bridge);
40    reg!("string:starts_with", partial::string_starts_with_bridge);
41    reg!("string:ends_with", partial::string_ends_with_bridge);
42    reg!("string:slice", partial::string_slice_bridge);
43    reg!("string:repeat", partial::string_repeat_bridge);
44    reg!("string:index_of", partial::string_index_of_bridge);
45    reg!("string:last_index_of", partial::string_last_index_of_bridge);
46
47    0
48}