//! Stories module for stories.

mod command;
mod context;

use command::{Command, StreamObserver};
pub(crate) use context::Context;

#[rune::function]
fn cargo_build_dir() -> String {
    std::env::var("CARGO_TARGET_DIR")
        .map_or_else(|_| "target/debug".into(), |x| format!("{}/debug", x))
}

pub(crate) fn module() -> anyhow::Result<rune::Module> {
    let mut m = rune::Module::with_crate("stories")?;

    m.function_meta(cargo_build_dir)?;

    // Context
    m.ty::<Context>()?;
    m.function_meta(Context::report_error)?;
    m.function_meta(Context::run_command)?;

    // StreamObserver
    m.ty::<StreamObserver>()?;
    m.function_meta(StreamObserver::contains)?;

    // Command
    m.ty::<Command>()?;
    m.function_meta(Command::stdout)?;

    Ok(m)
}
