1
//! Host function wrappers for WASM scripts.
2
//!
3
//! These functions are safe to call from within the Nomisync WASM runtime.
4
//! The WASM environment guarantees:
5
//! - Host functions are always linked
6
//! - Memory access is bounds-checked (traps on OOB)
7
//! - No undefined behavior, only traps on errors
8

            
9
unsafe extern "C" {
10
    fn get_input_offset() -> u32;
11
    fn get_output_offset() -> u32;
12
    fn get_strings_offset() -> u32;
13
    fn generate_uuid(out_ptr: u32);
14
    fn write_string(ptr: u32, len: u32) -> u32;
15
    fn log(level: u32, msg_ptr: u32, msg_len: u32);
16
    fn get_timestamp() -> i64;
17
}
18

            
19
#[must_use]
20
pub fn input_offset() -> u32 {
21
    unsafe { get_input_offset() }
22
}
23

            
24
#[must_use]
25
pub fn output_offset() -> u32 {
26
    unsafe { get_output_offset() }
27
}
28

            
29
#[must_use]
30
pub fn strings_offset() -> u32 {
31
    unsafe { get_strings_offset() }
32
}
33

            
34
#[must_use]
35
pub fn new_uuid() -> [u8; 16] {
36
    let mut uuid = [0u8; 16];
37
    unsafe { generate_uuid(uuid.as_mut_ptr() as u32) };
38
    uuid
39
}
40

            
41
#[must_use]
42
pub fn write_output_string(s: &str) -> u32 {
43
    unsafe { write_string(s.as_ptr() as u32, s.len() as u32) }
44
}
45

            
46
#[must_use]
47
pub fn timestamp() -> i64 {
48
    unsafe { get_timestamp() }
49
}
50

            
51
#[repr(u32)]
52
#[derive(Debug, Clone, Copy)]
53
pub enum LogLevel {
54
    Debug = 0,
55
    Info = 1,
56
    Warn = 2,
57
    Error = 3,
58
}
59

            
60
pub fn log_message(level: LogLevel, msg: &str) {
61
    unsafe { log(level as u32, msg.as_ptr() as u32, msg.len() as u32) }
62
}
63

            
64
pub fn log_debug(msg: &str) {
65
    log_message(LogLevel::Debug, msg);
66
}
67

            
68
pub fn log_info(msg: &str) {
69
    log_message(LogLevel::Info, msg);
70
}
71

            
72
pub fn log_warn(msg: &str) {
73
    log_message(LogLevel::Warn, msg);
74
}
75

            
76
pub fn log_error(msg: &str) {
77
    log_message(LogLevel::Error, msg);
78
}