duckscriptsdk 0.1.8

The duckscript SDK.
Documentation
use duckscript::parser;
use duckscript::runner;
use duckscript::types::command::{CommandResult, Commands};
use duckscript::types::runtime::StateValue;
use std::collections::HashMap;

#[cfg(test)]
#[path = "./eval_test.rs"]
mod eval_test;

pub(crate) fn eval(
    arguments: &Vec<String>,
    state: &mut HashMap<String, StateValue>,
    variables: &mut HashMap<String, String>,
    commands: &mut Commands,
) -> Result<CommandResult, String> {
    if arguments.is_empty() {
        Ok(CommandResult::Continue(None))
    } else {
        let mut line_buffer = String::new();
        for argument in arguments {
            if argument.contains(" ") {
                line_buffer.push('"');
            }
            line_buffer.push_str(argument);
            if argument.contains(" ") {
                line_buffer.push('"');
            }
            line_buffer.push(' ');
        }

        let line_str = line_buffer.replace("\r", "").replace("\n", "");

        match parser::parse_text(&line_str) {
            Ok(instructions) => {
                let (command_result, _) = runner::run_instruction(
                    commands,
                    variables,
                    state,
                    &vec![],
                    instructions[0].clone(),
                    0,
                );

                Ok(command_result)
            }
            Err(error) => Err(error.to_string()),
        }
    }
}

pub(crate) fn eval_with_error(
    arguments: &Vec<String>,
    state: &mut HashMap<String, StateValue>,
    variables: &mut HashMap<String, String>,
    commands: &mut Commands,
) -> CommandResult {
    match eval(arguments, state, variables, commands) {
        Ok(command_result) => match command_result.clone() {
            CommandResult::Crash(error) => CommandResult::Error(error),
            _ => command_result,
        },
        Err(error) => CommandResult::Error(error.to_string()),
    }
}