From f7230a30f484670c0b635aee1e10a91599a0fbcb Mon Sep 17 00:00:00 2001 From: Shautvast Date: Mon, 10 Nov 2025 18:23:47 +0100 Subject: [PATCH] refactored a bit so that the file will not grow out of bounds --- src/builtins/builtin_functions.rs | 33 +++++++++++++++ src/builtins/mod.rs | 2 + .../string.rs} | 40 +++++-------------- src/lib.rs | 2 +- src/vm.rs | 2 +- 5 files changed, 47 insertions(+), 32 deletions(-) create mode 100644 src/builtins/builtin_functions.rs create mode 100644 src/builtins/mod.rs rename src/{builtin_functions.rs => builtins/string.rs} (55%) diff --git a/src/builtins/builtin_functions.rs b/src/builtins/builtin_functions.rs new file mode 100644 index 0000000..7851127 --- /dev/null +++ b/src/builtins/builtin_functions.rs @@ -0,0 +1,33 @@ +use crate::value::Value; +use std::collections::HashMap; +use std::sync::LazyLock; +use crate::builtins::string::string_methods; +use crate::errors::RuntimeError; + +pub(crate) type MethodFn = fn(Value, Vec) -> Result; +pub(crate) type MethodMap = HashMap; +pub(crate) type MethodTable = HashMap; + +const METHODS: LazyLock = LazyLock::new(|| { + let mut table: MethodTable = HashMap::new(); + table.insert("string".to_string(), string_methods()); + table +}); + +pub(crate) fn insert(m: &mut MethodMap, name: &str, method: MethodFn) { + m.insert(name.to_string(), method); +} + +pub fn call_builtin( + type_name: &str, + method_name: &str, + self_val: Value, + args: Vec, +) -> Result { + METHODS + .get(type_name) + .and_then(|methods| methods.get(method_name)) + .ok_or_else(|| RuntimeError::FunctionNotFound(format!("{}.{}",type_name, method_name)))? + (self_val, args) +} + diff --git a/src/builtins/mod.rs b/src/builtins/mod.rs new file mode 100644 index 0000000..5d47111 --- /dev/null +++ b/src/builtins/mod.rs @@ -0,0 +1,2 @@ +pub mod builtin_functions; +mod string; \ No newline at end of file diff --git a/src/builtin_functions.rs b/src/builtins/string.rs similarity index 55% rename from src/builtin_functions.rs rename to src/builtins/string.rs index e247725..a036576 100644 --- a/src/builtin_functions.rs +++ b/src/builtins/string.rs @@ -1,37 +1,16 @@ -use crate::value::Value; use std::collections::HashMap; -use std::sync::LazyLock; +use crate::builtins::builtin_functions::{insert, MethodMap}; use crate::errors::RuntimeError; +use crate::value::Value; -type MethodFn = fn(Value, Vec) -> Result; -type MethodMap = HashMap; -type MethodTable = HashMap; - -const METHODS: LazyLock = LazyLock::new(|| { - let mut table: MethodTable = HashMap::new(); - +pub(crate) fn string_methods() -> MethodMap { let mut string_methods: MethodMap = HashMap::new(); - string_methods.insert("len".to_string(), string_len); - string_methods.insert("to_uppercase".to_string(), string_to_uppercase); - string_methods.insert("contains".to_string(), string_contains); - string_methods.insert("reverse".to_string(), string_reverse); - - table.insert("string".to_string(), string_methods); - - table -}); - -pub fn call_builtin( - type_name: &str, - method_name: &str, - self_val: Value, - args: Vec, -) -> Result { - METHODS - .get(type_name) - .and_then(|methods| methods.get(method_name)) - .ok_or_else(|| RuntimeError::FunctionNotFound(format!("{}.{}",type_name, method_name)))? - (self_val, args) + let m = &mut string_methods; + insert(m, "len", string_len); + insert(m, "to_uppercase", string_to_uppercase); + insert(m, "contains", string_contains); + insert(m, "reverse", string_reverse); + string_methods } fn string_len(self_val: Value, _args: Vec) -> Result { @@ -56,6 +35,7 @@ fn string_contains(self_val: Value, args: Vec) -> Result Err(RuntimeError::ExpectedType("string".to_string())), } } + fn string_reverse(self_val: Value, _: Vec) -> Result { match self_val { Value::String(s) => { diff --git a/src/lib.rs b/src/lib.rs index c615acf..bf11a8e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,7 +23,7 @@ mod symbol_builder; mod tokens; mod value; pub mod vm; -mod builtin_functions; +mod builtins; pub fn compile_sourcedir(source_dir: &str) -> Result, CrudLangError> { let mut registry = HashMap::new(); diff --git a/src/vm.rs b/src/vm.rs index 721b235..463b472 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -7,7 +7,7 @@ use arc_swap::Guard; use std::collections::HashMap; use std::sync::Arc; use tracing::debug; -use crate::builtin_functions::call_builtin; +use crate::builtins::builtin_functions::call_builtin; pub struct Vm { ip: usize,