sal/src/rhai/error.rs
2025-04-04 15:21:45 +02:00

60 lines
1.9 KiB
Rust

//! Error handling for Rhai integration
//!
//! This module provides utilities for converting SAL error types to Rhai error types.
use rhai::{EvalAltResult, Position};
use crate::os::{FsError, DownloadError};
/// Convert a FsError to a Rhai EvalAltResult
pub fn fs_error_to_rhai_error(err: FsError) -> Box<EvalAltResult> {
let err_msg = err.to_string();
Box::new(EvalAltResult::ErrorRuntime(
err_msg.into(),
Position::NONE
))
}
/// Convert a DownloadError to a Rhai EvalAltResult
pub fn download_error_to_rhai_error(err: DownloadError) -> Box<EvalAltResult> {
let err_msg = err.to_string();
Box::new(EvalAltResult::ErrorRuntime(
err_msg.into(),
Position::NONE
))
}
/// Register error types with the Rhai engine
pub fn register_error_types(engine: &mut rhai::Engine) -> Result<(), Box<EvalAltResult>> {
// Register helper functions for error handling
// Note: We don't register the error types directly since they don't implement Clone
// Instead, we'll convert them to strings in the wrappers
// Register functions to get error messages
engine.register_fn("fs_error_message", |err_msg: &str| -> String {
format!("File system error: {}", err_msg)
});
engine.register_fn("download_error_message", |err_msg: &str| -> String {
format!("Download error: {}", err_msg)
});
Ok(())
}
/// Trait for converting SAL errors to Rhai errors
pub trait ToRhaiError<T> {
/// Convert the error to a Rhai EvalAltResult
fn to_rhai_error(self) -> Result<T, Box<EvalAltResult>>;
}
impl<T> ToRhaiError<T> for Result<T, FsError> {
fn to_rhai_error(self) -> Result<T, Box<EvalAltResult>> {
self.map_err(fs_error_to_rhai_error)
}
}
impl<T> ToRhaiError<T> for Result<T, DownloadError> {
fn to_rhai_error(self) -> Result<T, Box<EvalAltResult>> {
self.map_err(download_error_to_rhai_error)
}
}