use super::{BuildResult, RustBuilder, RustBuilderError};
use rhai::{Engine, EvalAltResult, Position};
#[derive(Debug, Clone)]
pub struct RhaiRustBuilder {
inner: RustBuilder,
}
impl RhaiRustBuilder {
pub fn new() -> Self {
Self {
inner: RustBuilder::new(),
}
}
pub fn from_path(path: String) -> Self {
Self {
inner: RustBuilder::from_path(path),
}
}
pub fn release(mut self) -> Self {
self.inner = self.inner.release();
self
}
pub fn debug(mut self) -> Self {
self.inner = self.inner.debug();
self
}
pub fn bin(mut self, name: String) -> Self {
self.inner = self.inner.bin(name);
self
}
pub fn lib(mut self) -> Self {
self.inner = self.inner.lib();
self
}
pub fn example(mut self, name: String) -> Self {
self.inner = self.inner.example(name);
self
}
pub fn all_bins(mut self) -> Self {
self.inner = self.inner.all_bins();
self
}
pub fn feature(mut self, feature: String) -> Self {
self.inner = self.inner.feature(feature);
self
}
pub fn all_features(mut self) -> Self {
self.inner = self.inner.all_features();
self
}
pub fn no_default_features(mut self) -> Self {
self.inner = self.inner.no_default_features();
self
}
pub fn copy_to_hero_bin(mut self) -> Self {
self.inner = self.inner.copy_to_hero_bin();
self
}
pub fn output_dir(mut self, path: String) -> Self {
self.inner = self.inner.output_dir(path);
self
}
pub fn arg(mut self, arg: String) -> Self {
self.inner = self.inner.arg(arg);
self
}
pub fn verbose(mut self) -> Self {
self.inner = self.inner.verbose();
self
}
pub fn build(self) -> Result<RhaiBuildResult, Box<EvalAltResult>> {
match self.inner.build() {
Ok(result) => Ok(result.into()),
Err(RustBuilderError::BuildFailed { code, stderr }) => {
Ok(RhaiBuildResult {
success: false,
exit_code: code,
stdout: String::new(),
stderr,
artifacts: Vec::new(),
copied_to: None,
})
}
Err(e) => Err(Box::new(EvalAltResult::ErrorRuntime(
e.to_string().into(),
Position::NONE,
))),
}
}
}
impl Default for RhaiRustBuilder {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct RhaiBuildResult {
pub success: bool,
pub exit_code: i32,
pub stdout: String,
pub stderr: String,
pub artifacts: Vec<String>,
pub copied_to: Option<String>,
}
impl From<BuildResult> for RhaiBuildResult {
fn from(result: BuildResult) -> Self {
Self {
success: result.success,
exit_code: result.exit_code,
stdout: result.stdout,
stderr: result.stderr,
artifacts: result
.artifacts
.iter()
.map(|p| p.to_string_lossy().to_string())
.collect(),
copied_to: result
.copied_to
.as_ref()
.map(|p| p.to_string_lossy().to_string()),
}
}
}
pub fn register_rust_builder_module(engine: &mut Engine) -> Result<(), Box<EvalAltResult>> {
eprintln!("[DEBUG] Registering rust_builder module with Rhai");
engine.register_type_with_name::<RhaiBuildResult>("BuildResult");
engine.register_get("success", |r: &mut RhaiBuildResult| r.success);
engine.register_get("exit_code", |r: &mut RhaiBuildResult| r.exit_code);
engine.register_get("stdout", |r: &mut RhaiBuildResult| {
r.stdout.clone()
});
engine.register_get("stderr", |r: &mut RhaiBuildResult| {
r.stderr.clone()
});
engine.register_get("artifacts", |r: &mut RhaiBuildResult| {
r.artifacts.clone()
});
engine.register_get("copied_to", |r: &mut RhaiBuildResult| {
r.copied_to.clone()
});
engine.register_fn("rust_builder", || RhaiRustBuilder::new());
engine.register_fn("rust_builder_from", |path: String| RhaiRustBuilder::from_path(path));
engine.register_fn("release", |b: RhaiRustBuilder| b.release());
engine.register_fn("debug", |b: RhaiRustBuilder| b.debug());
engine.register_fn("bin", |b: RhaiRustBuilder, name: String| b.bin(name));
engine.register_fn("lib", |b: RhaiRustBuilder| b.lib());
engine.register_fn("example", |b: RhaiRustBuilder, name: String| b.example(name));
engine.register_fn("all_bins", |b: RhaiRustBuilder| b.all_bins());
engine.register_fn("feature", |b: RhaiRustBuilder, name: String| b.feature(name));
engine.register_fn("all_features", |b: RhaiRustBuilder| b.all_features());
engine.register_fn("no_default_features", |b: RhaiRustBuilder| b.no_default_features());
engine.register_fn("copy_to_hero_bin", |b: RhaiRustBuilder| b.copy_to_hero_bin());
engine.register_fn("output_dir", |b: RhaiRustBuilder, path: String| b.output_dir(path));
engine.register_fn("arg", |b: RhaiRustBuilder, arg: String| b.arg(arg));
engine.register_fn("verbose", |b: RhaiRustBuilder| b.verbose());
engine.register_fn("build", |b: RhaiRustBuilder| b.build());
Ok(())
}