Skip to main content

fiddler_script/builtins/
mod.rs

1//! Built-in functions for FiddlerScript.
2//!
3//! This module provides the default built-in functions and a system for
4//! registering custom built-in functions.
5
6mod bytes;
7mod collections;
8mod compression;
9mod core;
10mod encoding;
11mod json;
12mod math;
13mod strings;
14mod time;
15
16use std::collections::HashMap;
17
18use crate::error::RuntimeError;
19use crate::Value;
20
21// Re-export json_to_value for use by other modules
22pub use json::json_to_value;
23
24/// Type alias for built-in function signatures.
25pub type BuiltinFn = fn(Vec<Value>) -> Result<Value, RuntimeError>;
26
27/// Get the default built-in functions.
28pub fn get_default_builtins() -> HashMap<String, BuiltinFn> {
29    let mut builtins: HashMap<String, BuiltinFn> = HashMap::new();
30
31    // Core functions
32    builtins.insert("print".to_string(), core::builtin_print);
33    builtins.insert("len".to_string(), core::builtin_len);
34    builtins.insert("str".to_string(), core::builtin_str);
35    builtins.insert("int".to_string(), core::builtin_int);
36    builtins.insert("float".to_string(), core::builtin_float);
37    builtins.insert("getenv".to_string(), core::builtin_getenv);
38
39    // Math functions
40    builtins.insert("abs".to_string(), math::builtin_abs);
41    builtins.insert("ceil".to_string(), math::builtin_ceil);
42    builtins.insert("floor".to_string(), math::builtin_floor);
43    builtins.insert("round".to_string(), math::builtin_round);
44
45    // Time functions
46    builtins.insert("timestamp".to_string(), time::builtin_timestamp);
47    builtins.insert("epoch".to_string(), time::builtin_epoch);
48    builtins.insert(
49        "timestamp_millis".to_string(),
50        time::builtin_timestamp_millis,
51    );
52    builtins.insert(
53        "timestamp_micros".to_string(),
54        time::builtin_timestamp_micros,
55    );
56    builtins.insert(
57        "timestamp_iso8601".to_string(),
58        time::builtin_timestamp_iso8601,
59    );
60
61    // JSON
62    builtins.insert("parse_json".to_string(), json::builtin_parse_json);
63
64    // Bytes conversion
65    builtins.insert(
66        "bytes_to_string".to_string(),
67        bytes::builtin_bytes_to_string,
68    );
69    builtins.insert("bytes".to_string(), bytes::builtin_bytes);
70
71    // Collections
72    builtins.insert("array".to_string(), collections::builtin_array);
73    builtins.insert("push".to_string(), collections::builtin_push);
74    builtins.insert("get".to_string(), collections::builtin_get);
75    builtins.insert("set".to_string(), collections::builtin_set);
76    builtins.insert("dict".to_string(), collections::builtin_dict);
77    builtins.insert("keys".to_string(), collections::builtin_keys);
78    builtins.insert("is_array".to_string(), collections::builtin_is_array);
79    builtins.insert("is_dict".to_string(), collections::builtin_is_dict);
80    builtins.insert("delete".to_string(), collections::builtin_delete);
81    builtins.insert("contains".to_string(), collections::builtin_contains);
82
83    // Compression
84    builtins.insert(
85        "gzip_compress".to_string(),
86        compression::builtin_gzip_compress,
87    );
88    builtins.insert(
89        "gzip_decompress".to_string(),
90        compression::builtin_gzip_decompress,
91    );
92    builtins.insert(
93        "zlib_compress".to_string(),
94        compression::builtin_zlib_compress,
95    );
96    builtins.insert(
97        "zlib_decompress".to_string(),
98        compression::builtin_zlib_decompress,
99    );
100    builtins.insert(
101        "deflate_compress".to_string(),
102        compression::builtin_deflate_compress,
103    );
104    builtins.insert(
105        "deflate_decompress".to_string(),
106        compression::builtin_deflate_decompress,
107    );
108
109    // Encoding
110    builtins.insert("base64_encode".to_string(), encoding::builtin_base64_encode);
111    builtins.insert("base64_decode".to_string(), encoding::builtin_base64_decode);
112
113    // String methods
114    builtins.insert("lines".to_string(), strings::builtin_lines);
115    builtins.insert("capitalize".to_string(), strings::builtin_capitalize);
116    builtins.insert("lowercase".to_string(), strings::builtin_lowercase);
117    builtins.insert("uppercase".to_string(), strings::builtin_uppercase);
118    builtins.insert("trim".to_string(), strings::builtin_trim);
119    builtins.insert("trim_prefix".to_string(), strings::builtin_trim_prefix);
120    builtins.insert("trim_suffix".to_string(), strings::builtin_trim_suffix);
121    builtins.insert("has_prefix".to_string(), strings::builtin_has_prefix);
122    builtins.insert("has_suffix".to_string(), strings::builtin_has_suffix);
123    builtins.insert("split".to_string(), strings::builtin_split);
124    builtins.insert("reverse".to_string(), strings::builtin_reverse);
125
126    builtins
127}
128
129#[cfg(test)]
130mod tests {
131    use super::*;
132
133    #[test]
134    fn test_default_builtins() {
135        let builtins = get_default_builtins();
136
137        // Core
138        assert!(builtins.contains_key("print"));
139        assert!(builtins.contains_key("len"));
140        assert!(builtins.contains_key("str"));
141        assert!(builtins.contains_key("int"));
142        assert!(builtins.contains_key("getenv"));
143
144        // Math
145        assert!(builtins.contains_key("abs"));
146        assert!(builtins.contains_key("ceil"));
147        assert!(builtins.contains_key("floor"));
148        assert!(builtins.contains_key("round"));
149
150        // Time
151        assert!(builtins.contains_key("timestamp"));
152        assert!(builtins.contains_key("epoch"));
153        assert!(builtins.contains_key("timestamp_millis"));
154        assert!(builtins.contains_key("timestamp_micros"));
155        assert!(builtins.contains_key("timestamp_iso8601"));
156
157        // JSON
158        assert!(builtins.contains_key("parse_json"));
159
160        // Bytes
161        assert!(builtins.contains_key("bytes_to_string"));
162        assert!(builtins.contains_key("bytes"));
163
164        // Collections
165        assert!(builtins.contains_key("array"));
166        assert!(builtins.contains_key("push"));
167        assert!(builtins.contains_key("get"));
168        assert!(builtins.contains_key("set"));
169        assert!(builtins.contains_key("dict"));
170        assert!(builtins.contains_key("keys"));
171        assert!(builtins.contains_key("is_array"));
172        assert!(builtins.contains_key("is_dict"));
173        assert!(builtins.contains_key("delete"));
174        assert!(builtins.contains_key("contains"));
175
176        // Compression
177        assert!(builtins.contains_key("gzip_compress"));
178        assert!(builtins.contains_key("gzip_decompress"));
179        assert!(builtins.contains_key("zlib_compress"));
180        assert!(builtins.contains_key("zlib_decompress"));
181        assert!(builtins.contains_key("deflate_compress"));
182        assert!(builtins.contains_key("deflate_decompress"));
183
184        // Encoding
185        assert!(builtins.contains_key("base64_encode"));
186        assert!(builtins.contains_key("base64_decode"));
187
188        // String methods
189        assert!(builtins.contains_key("lines"));
190        assert!(builtins.contains_key("capitalize"));
191        assert!(builtins.contains_key("lowercase"));
192        assert!(builtins.contains_key("uppercase"));
193        assert!(builtins.contains_key("trim"));
194        assert!(builtins.contains_key("trim_prefix"));
195        assert!(builtins.contains_key("trim_suffix"));
196        assert!(builtins.contains_key("has_prefix"));
197        assert!(builtins.contains_key("has_suffix"));
198        assert!(builtins.contains_key("split"));
199        assert!(builtins.contains_key("reverse"));
200    }
201}