embers-client 0.1.0

Client rendering, input handling, configuration, and scripting support for Embers.
use std::path::PathBuf;

use crate::config::{ConfigOrigin, LoadedConfigSource};
use crate::input::{InputResolution, InputState, parse_key_sequence, resolve_key};

use super::{ScriptEngine, ScriptError};

pub struct ScriptHarness {
    engine: ScriptEngine,
    input_state: InputState,
}

impl ScriptHarness {
    pub fn load(source: &str) -> Result<Self, ScriptError> {
        let loaded_source = LoadedConfigSource {
            origin: ConfigOrigin::BuiltIn,
            path: Some(PathBuf::from("script-harness.rhai")),
            source: source.trim().to_owned(),
            source_hash: 0,
        };
        Ok(Self {
            engine: ScriptEngine::load(&loaded_source)?,
            input_state: InputState::default(),
        })
    }

    pub fn engine(&self) -> &ScriptEngine {
        &self.engine
    }

    pub fn resolve_notation(
        &mut self,
        mode: &str,
        notation: &str,
    ) -> Result<InputResolution<Vec<super::Action>>, crate::input::KeyParseError> {
        self.input_state.set_mode(mode);
        let mut last_resolution = None;
        for key in parse_key_sequence(notation)? {
            last_resolution = Some(resolve_key(
                &self.engine.loaded_config().bindings,
                &self.engine.loaded_config().modes,
                &mut self.input_state,
                key,
            ));
        }
        last_resolution.ok_or(crate::input::KeyParseError::EmptySequence)
    }
}