ksl 0.1.30

KSL core library and interpreter
Documentation
//! # ksl::builtin::module
//!
//! Built-in function `Module`.

use crate::{Environment, MODULE_NAME_ENV, read_from_environment, value::Value};

pub(crate) fn builtin(args: &[Value], env: Environment) -> Result<Value, std::sync::Arc<str>> {
    if let [val] = args {
        let existing_name = read_from_environment(&env, &MODULE_NAME_ENV);
        if let Some(val_ref) = existing_name
            && let Value::String(previous_name) = val_ref.as_ref()
        {
            return Err(std::sync::Arc::from(format!(
                concat!(
                    "Error[ksl::builtin::Module]: ",
                    "Current module is already bound as {}."
                ),
                previous_name
            )));
        }

        // set module name
        match val {
            Value::String(name) => {
                let _ = env.store.write().insert(
                    MODULE_NAME_ENV.clone(),
                    std::sync::Arc::new(Value::String(name.clone())),
                );
                Ok(Value::Unit)
            }
            e => Err(std::sync::Arc::from(format!(
                concat!("Error[ksl::builtin::Module]: ", "Unexpected value: `{}`."),
                e
            ))),
        }
    } else {
        Err(std::sync::Arc::from(format!(
            concat!(
                "Error[ksl::builtin::Module]: ",
                "Expected 1 parameter, but {} were passed."
            ),
            args.len()
        )))
    }
}