ksl 0.1.7

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

use crate::{Environment, builtin::eval_builtin, eval::apply::eval_apply, value::Value};

pub(crate) fn builtin(args: &[Value], env: &Environment) -> Option<(Value, Environment)> {
    if let [id @ Value::Identity(_), libfunc] = &args[..] {
        match eval_apply(libfunc, env) {
            Some((Value::String(lib_and_func), _)) => {
                if let [libname, func_name] = &lib_and_func.split("/").collect::<Vec<&str>>()[..] {
                    eval_builtin(
                        "Let",
                        &[
                            id.clone(),
                            Value::Plugin(libname.to_string(), func_name.to_string()),
                        ],
                        env,
                    )
                } else {
                    eprintln!(
                        concat!(
                            "Error[ksl::builtin::plugin]: ",
                            "Failed to get library path, ",
                            "expected format is `library_name/function_name`, ",
                            "but got `{:?}`."
                        ),
                        lib_and_func
                    );
                    None
                }
            }
            Some((e, _)) => {
                eprintln!(
                    concat!(
                        "Error[ksl::builtin::plugin]: ",
                        "Expected a string, but got `{:?}`."
                    ),
                    e
                );
                None
            }
            None => {
                eprintln!(
                    concat!(
                        "Error[ksl::builtin::plugin]: ",
                        "Cannot evaluate expression {:?}."
                    ),
                    libfunc
                );
                None
            }
        }
    } else {
        eprintln!(concat!(
            "Error[ksl::builtin::plugin]: ",
            "Only accepts a symbol and a value as arguments.",
        ));
        None
    }
}