use rhai::EvalAltResult;
use std::fmt;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum RhaiError {
#[error("Operation failed: {0}")]
OperationError(String),
#[error("Script error: {0}")]
ScriptError(String),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
#[error("Repository error: {0}")]
RepoError(String),
#[error("Socket error: {0}")]
SocketError(String),
#[error("Fatal: {0}")]
Fatal(String),
}
impl From<Box<EvalAltResult>> for RhaiError {
fn from(e: Box<EvalAltResult>) -> Self {
RhaiError::ScriptError(e.to_string())
}
}
impl From<crate::FossilError> for RhaiError {
fn from(e: crate::FossilError) -> Self {
RhaiError::RepoError(e.to_string())
}
}
impl From<RhaiError> for Box<EvalAltResult> {
fn from(e: RhaiError) -> Self {
Box::new(EvalAltResult::ErrorRuntime(
e.to_string().into(),
rhai::Position::NONE,
))
}
}
pub type RhaiResult<T> = std::result::Result<T, RhaiError>;
pub fn to_rhai_result<T, E: fmt::Display>(result: Result<T, E>) -> Result<T, Box<EvalAltResult>> {
result.map_err(|e| {
Box::new(EvalAltResult::ErrorRuntime(
e.to_string().into(),
rhai::Position::NONE,
))
})
}