pub(crate) mod dotenv;
pub mod js;
pub mod rhai;
pub fn write_definitions(lang: Lang, out: &Path) -> Result<()> {
match lang {
Lang::Rhai => self::rhai::write_definitions(out),
Lang::Js => self::js::write_definitions(out),
}
}
pub fn write_book_api(lang: Lang, out: &Path) -> Result<()> {
match lang {
Lang::Rhai => self::rhai::write_book_api(out),
Lang::Js => anyhow::bail!(
"JS API docs are generated from the hand-written .d.ts via TypeDoc, not by this command"
),
}
}
use crate::engine::Filters;
use crate::runtime::Output;
use anyhow::Result;
use std::collections::HashMap;
use std::path::{Path, PathBuf};
pub fn scenario_names(path: &Path) -> Vec<String> {
if path.extension().is_some_and(|e| e == "js") {
self::js::scenario_names(path)
} else {
self::rhai::scenario_names(path)
}
}
pub fn check(lang: Lang, file: &Path) -> Result<()> {
match lang {
Lang::Rhai => self::rhai::check(file),
Lang::Js => self::js::check(file),
}
}
#[derive(Clone, Copy, Default, PartialEq, Eq, clap::ValueEnum)]
pub enum Lang {
#[default]
Rhai,
Js,
}
pub fn detect_lang(paths: &[PathBuf]) -> Lang {
if paths.iter().any(|p| contains_js(p)) {
Lang::Js
} else {
Lang::Rhai
}
}
fn contains_js(path: &Path) -> bool {
if path.extension().is_some_and(|e| e == "js") {
return true;
}
path.is_dir()
&& std::fs::read_dir(path)
.map(|entries| entries.flatten().any(|e| contains_js(&e.path())))
.unwrap_or(false)
}
pub fn run(
lang: Lang,
paths: &[PathBuf],
output: Output,
overrides: HashMap<String, String>,
filters: Filters,
env_files: &[PathBuf],
) -> Result<()> {
match lang {
Lang::Rhai => self::rhai::run(paths, output, overrides, filters, env_files),
Lang::Js => self::js::run(paths, output, overrides, filters, env_files),
}
}