Skip to main content

seq_runtime/
lib.rs

1//! Seq Runtime: A clean concatenative language foundation
2//!
3//! Key design principles:
4//! - Value: What the language talks about (Int, Bool, Variant, etc.)
5//! - StackValue: 8-byte tagged pointer (Int/Bool inline, heap types Arc-wrapped)
6//! - Stack: Contiguous array of StackValue entries for efficient operations
7
8// Re-export core modules from seq-core (foundation for stack-based languages)
9pub use seq_core::arena;
10pub use seq_core::error;
11pub use seq_core::memory_stats;
12pub use seq_core::seqstring;
13pub use seq_core::son;
14pub use seq_core::stack;
15pub use seq_core::tagged_stack;
16pub use seq_core::value;
17
18// Seq-specific modules (always available - core runtime)
19pub mod args;
20pub mod arithmetic;
21pub mod bytes_ops;
22pub mod channel;
23pub mod closures;
24pub mod combinators;
25pub mod cond;
26pub mod diagnostics;
27pub mod dns;
28pub mod encoding;
29pub mod exit_code;
30pub mod file;
31pub mod float_ops;
32pub mod io;
33pub mod list_ops;
34pub mod map_ops;
35pub mod os;
36pub mod quotations;
37pub mod report;
38pub mod scheduler;
39pub mod serialize;
40pub mod signal;
41pub mod string_ops;
42pub mod tcp;
43pub mod tcp_test;
44pub mod terminal;
45pub mod test;
46pub mod time_ops;
47pub mod tls;
48pub mod udp;
49pub mod variant_ops;
50pub mod watchdog;
51pub mod weave;
52
53#[cfg(not(feature = "diagnostics"))]
54pub mod report_stub;
55
56// Optional modules - gated by feature flags
57#[cfg(feature = "crypto")]
58pub mod crypto;
59#[cfg(not(feature = "crypto"))]
60pub mod crypto_stub;
61
62#[cfg(feature = "http")]
63pub mod http_client;
64#[cfg(not(feature = "http"))]
65pub mod http_stub;
66
67#[cfg(feature = "regex")]
68pub mod regex;
69#[cfg(not(feature = "regex"))]
70pub mod regex_stub;
71
72#[cfg(feature = "compression")]
73pub mod compress;
74#[cfg(not(feature = "compression"))]
75pub mod compress_stub;
76
77// Re-export key types and functions from seq-core
78pub use seq_core::{ChannelData, MapKey, Value, VariantData, WeaveChannelData, WeaveMessage};
79pub use seq_core::{
80    DISC_BOOL, DISC_CHANNEL, DISC_CLOSURE, DISC_FLOAT, DISC_INT, DISC_MAP, DISC_QUOTATION,
81    DISC_STRING, DISC_SYMBOL, DISC_VARIANT, DISC_WEAVECTX, Stack, alloc_stack, alloc_test_stack,
82    clone_stack, clone_stack_value, clone_value, drop_op, drop_stack_value, drop_top, dup, nip,
83    over, peek, peek_sv, pick_op, pop, pop_sv, push, push_sv, push_value, roll, rot,
84    set_stack_base, stack_dump, stack_value_to_value, swap, tuck, two_dup, value_to_stack_value,
85};
86
87// SON serialization (from seq-core)
88pub use seq_core::{son_dump, son_dump_pretty};
89
90// Error handling (from seq-core)
91pub use seq_core::{
92    clear_error, clear_runtime_error, get_error, has_error, has_runtime_error, set_runtime_error,
93    take_error, take_runtime_error,
94};
95
96// Serialization types (for persistence/exchange with external systems)
97pub use serialize::{SerializeError, TypedMapKey, TypedValue, ValueSerialize};
98
99// Arithmetic operations (exported for LLVM linking)
100pub use arithmetic::{
101    patch_seq_add as add, patch_seq_divide as divide, patch_seq_eq as eq, patch_seq_gt as gt,
102    patch_seq_gte as gte, patch_seq_lt as lt, patch_seq_lte as lte, patch_seq_multiply as multiply,
103    patch_seq_neq as neq, patch_seq_push_bool as push_bool, patch_seq_push_int as push_int,
104    patch_seq_subtract as subtract,
105};
106
107// Float operations (exported for LLVM linking)
108pub use float_ops::{
109    patch_seq_f_add as f_add, patch_seq_f_divide as f_divide, patch_seq_f_eq as f_eq,
110    patch_seq_f_gt as f_gt, patch_seq_f_gte as f_gte, patch_seq_f_lt as f_lt,
111    patch_seq_f_lte as f_lte, patch_seq_f_multiply as f_multiply, patch_seq_f_neq as f_neq,
112    patch_seq_f_subtract as f_subtract, patch_seq_float_to_int as float_to_int,
113    patch_seq_float_to_string as float_to_string, patch_seq_int_to_float as int_to_float,
114    patch_seq_push_float as push_float,
115};
116
117// I/O operations (exported for LLVM linking)
118pub use io::{
119    patch_seq_exit_op as exit_op, patch_seq_push_interned_symbol as push_interned_symbol,
120    patch_seq_push_string as push_string, patch_seq_push_string_bytes as push_string_bytes,
121    patch_seq_push_symbol as push_symbol, patch_seq_read_line as read_line,
122    patch_seq_read_n as read_n, patch_seq_string_to_symbol as string_to_symbol,
123    patch_seq_symbol_to_string as symbol_to_string, patch_seq_write_line as write_line,
124};
125
126// Scheduler operations (exported for LLVM linking)
127pub use scheduler::{
128    patch_seq_maybe_yield as maybe_yield, patch_seq_scheduler_init as scheduler_init,
129    patch_seq_scheduler_run as scheduler_run, patch_seq_scheduler_shutdown as scheduler_shutdown,
130    patch_seq_spawn_strand as spawn_strand, patch_seq_strand_spawn as strand_spawn,
131    patch_seq_wait_all_strands as wait_all_strands, patch_seq_yield_strand as yield_strand,
132};
133
134// Channel operations (exported for LLVM linking)
135// Note: All channel ops now return success flags (errors are values, not crashes)
136pub use channel::{
137    patch_seq_chan_receive as receive, patch_seq_chan_send as send,
138    patch_seq_close_channel as close_channel, patch_seq_make_channel as make_channel,
139};
140
141// Weave operations (generators/coroutines with yield/resume)
142pub use weave::{
143    patch_seq_resume as weave_resume, patch_seq_weave as weave_make,
144    patch_seq_weave_cancel as weave_cancel, patch_seq_yield as weave_yield,
145};
146
147// String operations (exported for LLVM linking)
148pub use io::patch_seq_int_to_string as int_to_string;
149pub use string_ops::{
150    patch_seq_json_escape as json_escape, patch_seq_string_chomp as string_chomp,
151    patch_seq_string_concat as string_concat, patch_seq_string_contains as string_contains,
152    patch_seq_string_empty as string_empty, patch_seq_string_join as string_join,
153    patch_seq_string_length as string_length, patch_seq_string_split as string_split,
154    patch_seq_string_starts_with as string_starts_with, patch_seq_string_to_int as string_to_int,
155    patch_seq_string_to_lower as string_to_lower, patch_seq_string_to_upper as string_to_upper,
156    patch_seq_string_trim as string_trim,
157};
158
159// Byte construction primitives (exported for LLVM linking)
160pub use bytes_ops::{
161    patch_seq_float_to_bytes_f32_be as float_to_bytes_f32_be,
162    patch_seq_int_to_bytes_i32_be as int_to_bytes_i32_be,
163};
164
165// Encoding operations (exported for LLVM linking)
166pub use encoding::{
167    patch_seq_base64_decode as base64_decode, patch_seq_base64_encode as base64_encode,
168    patch_seq_base64url_decode as base64url_decode, patch_seq_base64url_encode as base64url_encode,
169    patch_seq_hex_decode as hex_decode, patch_seq_hex_encode as hex_encode,
170};
171
172// Crypto operations (exported for LLVM linking)
173#[cfg(feature = "crypto")]
174pub use crypto::{
175    patch_seq_constant_time_eq as constant_time_eq,
176    patch_seq_crypto_aes_gcm_decrypt as crypto_aes_gcm_decrypt,
177    patch_seq_crypto_aes_gcm_encrypt as crypto_aes_gcm_encrypt,
178    patch_seq_crypto_ed25519_keypair as crypto_ed25519_keypair,
179    patch_seq_crypto_ed25519_sign as crypto_ed25519_sign,
180    patch_seq_crypto_ed25519_verify as crypto_ed25519_verify,
181    patch_seq_crypto_pbkdf2_sha256 as crypto_pbkdf2_sha256, patch_seq_hmac_sha256 as hmac_sha256,
182    patch_seq_random_bytes as random_bytes, patch_seq_random_int as random_int,
183    patch_seq_sha256 as sha256, patch_seq_uuid4 as uuid4,
184};
185#[cfg(not(feature = "crypto"))]
186pub use crypto_stub::{
187    patch_seq_constant_time_eq as constant_time_eq,
188    patch_seq_crypto_aes_gcm_decrypt as crypto_aes_gcm_decrypt,
189    patch_seq_crypto_aes_gcm_encrypt as crypto_aes_gcm_encrypt,
190    patch_seq_crypto_ed25519_keypair as crypto_ed25519_keypair,
191    patch_seq_crypto_ed25519_sign as crypto_ed25519_sign,
192    patch_seq_crypto_ed25519_verify as crypto_ed25519_verify,
193    patch_seq_crypto_pbkdf2_sha256 as crypto_pbkdf2_sha256, patch_seq_hmac_sha256 as hmac_sha256,
194    patch_seq_random_bytes as random_bytes, patch_seq_random_int as random_int,
195    patch_seq_sha256 as sha256, patch_seq_uuid4 as uuid4,
196};
197
198// Regex operations (exported for LLVM linking)
199#[cfg(feature = "regex")]
200pub use regex::{
201    patch_seq_regex_captures as regex_captures, patch_seq_regex_find as regex_find,
202    patch_seq_regex_find_all as regex_find_all, patch_seq_regex_match as regex_match,
203    patch_seq_regex_replace as regex_replace, patch_seq_regex_replace_all as regex_replace_all,
204    patch_seq_regex_split as regex_split, patch_seq_regex_valid as regex_valid,
205};
206#[cfg(not(feature = "regex"))]
207pub use regex_stub::{
208    patch_seq_regex_captures as regex_captures, patch_seq_regex_find as regex_find,
209    patch_seq_regex_find_all as regex_find_all, patch_seq_regex_match as regex_match,
210    patch_seq_regex_replace as regex_replace, patch_seq_regex_replace_all as regex_replace_all,
211    patch_seq_regex_split as regex_split, patch_seq_regex_valid as regex_valid,
212};
213
214// Compression operations (exported for LLVM linking)
215#[cfg(feature = "compression")]
216pub use compress::{
217    patch_seq_compress_gunzip as compress_gunzip, patch_seq_compress_gzip as compress_gzip,
218    patch_seq_compress_gzip_level as compress_gzip_level,
219    patch_seq_compress_unzstd as compress_unzstd, patch_seq_compress_zstd as compress_zstd,
220    patch_seq_compress_zstd_level as compress_zstd_level,
221};
222#[cfg(not(feature = "compression"))]
223pub use compress_stub::{
224    patch_seq_compress_gunzip as compress_gunzip, patch_seq_compress_gzip as compress_gzip,
225    patch_seq_compress_gzip_level as compress_gzip_level,
226    patch_seq_compress_unzstd as compress_unzstd, patch_seq_compress_zstd as compress_zstd,
227    patch_seq_compress_zstd_level as compress_zstd_level,
228};
229
230// Quotation operations (exported for LLVM linking)
231pub use quotations::{
232    patch_seq_call as call, patch_seq_peek_is_quotation as peek_is_quotation,
233    patch_seq_peek_quotation_fn_ptr as peek_quotation_fn_ptr,
234    patch_seq_push_quotation as push_quotation, patch_seq_spawn as spawn,
235};
236
237// Closure operations (exported for LLVM linking)
238pub use closures::{
239    patch_seq_create_env as create_env, patch_seq_env_get as env_get,
240    patch_seq_env_get_int as env_get_int, patch_seq_env_set as env_set,
241    patch_seq_make_closure as make_closure, patch_seq_push_closure as push_closure,
242};
243
244// Dataflow combinators (exported for LLVM linking)
245pub use combinators::{bi, dip, if_combinator, keep};
246
247// Conditional combinator (exported for LLVM linking)
248pub use cond::patch_seq_cond as cond;
249
250// Exit code handling (exported for LLVM linking)
251pub use exit_code::{
252    patch_seq_get_exit_code as get_exit_code, patch_seq_set_exit_code as set_exit_code,
253};
254
255// TCP operations (exported for LLVM linking)
256pub use tcp::{
257    patch_seq_tcp_accept as tcp_accept, patch_seq_tcp_close as tcp_close,
258    patch_seq_tcp_connect as tcp_connect, patch_seq_tcp_listen as tcp_listen,
259    patch_seq_tcp_local_port as tcp_local_port, patch_seq_tcp_read as tcp_read,
260    patch_seq_tcp_write as tcp_write,
261};
262
263// UDP operations (exported for LLVM linking)
264pub use udp::{
265    patch_seq_udp_bind as udp_bind, patch_seq_udp_close as udp_close,
266    patch_seq_udp_receive_from as udp_receive_from, patch_seq_udp_send_to as udp_send_to,
267};
268
269// DNS operations (exported for LLVM linking)
270pub use dns::patch_seq_dns_resolve as dns_resolve;
271
272// TLS operations (exported for LLVM linking)
273pub use tls::patch_seq_tls_client as tls_client;
274
275// OS operations (exported for LLVM linking)
276pub use os::{
277    patch_seq_current_dir as current_dir, patch_seq_exit as exit, patch_seq_getenv as getenv,
278    patch_seq_home_dir as home_dir, patch_seq_os_arch as os_arch, patch_seq_os_name as os_name,
279    patch_seq_path_exists as path_exists, patch_seq_path_filename as path_filename,
280    patch_seq_path_is_dir as path_is_dir, patch_seq_path_is_file as path_is_file,
281    patch_seq_path_join as path_join, patch_seq_path_parent as path_parent,
282};
283
284// Variant operations (exported for LLVM linking)
285pub use variant_ops::{
286    patch_seq_make_variant_0 as make_variant_0, patch_seq_make_variant_1 as make_variant_1,
287    patch_seq_make_variant_2 as make_variant_2, patch_seq_make_variant_3 as make_variant_3,
288    patch_seq_make_variant_4 as make_variant_4, patch_seq_make_variant_5 as make_variant_5,
289    patch_seq_make_variant_6 as make_variant_6, patch_seq_make_variant_7 as make_variant_7,
290    patch_seq_make_variant_8 as make_variant_8, patch_seq_make_variant_9 as make_variant_9,
291    patch_seq_make_variant_10 as make_variant_10, patch_seq_make_variant_11 as make_variant_11,
292    patch_seq_make_variant_12 as make_variant_12, patch_seq_unpack_variant as unpack_variant,
293    patch_seq_variant_field_at as variant_field_at,
294    patch_seq_variant_field_count as variant_field_count, patch_seq_variant_tag as variant_tag,
295};
296
297// Command-line argument operations (exported for LLVM linking)
298pub use args::{
299    patch_seq_arg_at as arg_at, patch_seq_arg_count as arg_count, patch_seq_args_init as args_init,
300};
301
302// File operations (exported for LLVM linking)
303pub use file::{
304    patch_seq_file_exists as file_exists, patch_seq_file_for_each_line as file_for_each_line,
305    patch_seq_file_slurp as file_slurp,
306};
307
308// List operations (exported for LLVM linking)
309pub use list_ops::{
310    patch_seq_list_each as list_each, patch_seq_list_empty as list_empty,
311    patch_seq_list_filter as list_filter, patch_seq_list_fold as list_fold,
312    patch_seq_list_get as list_get, patch_seq_list_length as list_length,
313    patch_seq_list_make as list_make, patch_seq_list_map as list_map,
314    patch_seq_list_push as list_push, patch_seq_list_reverse as list_reverse,
315    patch_seq_list_set as list_set,
316};
317
318// Map operations (exported for LLVM linking)
319pub use map_ops::{
320    patch_seq_make_map as make_map, patch_seq_map_each as map_each,
321    patch_seq_map_empty as map_empty, patch_seq_map_fold as map_fold, patch_seq_map_get as map_get,
322    patch_seq_map_has as map_has, patch_seq_map_keys as map_keys,
323    patch_seq_map_remove as map_remove, patch_seq_map_set as map_set,
324    patch_seq_map_size as map_size, patch_seq_map_values as map_values,
325};
326
327// Test framework operations (exported for LLVM linking)
328pub use test::{
329    patch_seq_test_assert as test_assert, patch_seq_test_assert_eq as test_assert_eq,
330    patch_seq_test_assert_eq_str as test_assert_eq_str,
331    patch_seq_test_assert_not as test_assert_not, patch_seq_test_fail as test_fail,
332    patch_seq_test_fail_count as test_fail_count, patch_seq_test_finish as test_finish,
333    patch_seq_test_has_failures as test_has_failures, patch_seq_test_init as test_init,
334    patch_seq_test_pass_count as test_pass_count, patch_seq_test_set_line as test_set_line,
335    patch_seq_test_set_name as test_set_name,
336};
337
338// Time operations (exported for LLVM linking)
339pub use time_ops::{
340    patch_seq_time_nanos as time_nanos, patch_seq_time_now as time_now,
341    patch_seq_time_sleep_ms as time_sleep_ms,
342};
343
344// Terminal operations (exported for LLVM linking)
345pub use terminal::{
346    patch_seq_terminal_flush as terminal_flush, patch_seq_terminal_height as terminal_height,
347    patch_seq_terminal_raw_mode as terminal_raw_mode,
348    patch_seq_terminal_read_char as terminal_read_char,
349    patch_seq_terminal_read_char_nonblock as terminal_read_char_nonblock,
350    patch_seq_terminal_width as terminal_width,
351};
352
353// HTTP client operations (exported for LLVM linking)
354#[cfg(feature = "http")]
355pub use http_client::{
356    patch_seq_http_delete as http_delete, patch_seq_http_get as http_get,
357    patch_seq_http_post as http_post, patch_seq_http_put as http_put,
358};
359#[cfg(not(feature = "http"))]
360pub use http_stub::{
361    patch_seq_http_delete as http_delete, patch_seq_http_get as http_get,
362    patch_seq_http_post as http_post, patch_seq_http_put as http_put,
363};