use alloc::boxed::Box;
use alloc::string::String;
use core::error::Error;
use miden_protocol::assembly::diagnostics::Report;
use miden_protocol::assembly::diagnostics::reporting::PrintDiagnostic;
#[derive(Debug, thiserror::Error)]
#[error("failed to build script: {message}")]
pub struct CodeBuilderError {
message: Box<str>,
source: Option<Box<dyn Error + Send + Sync + 'static>>,
}
impl CodeBuilderError {
pub fn build_error_with_source(
message: impl Into<String>,
source: impl Error + Send + Sync + 'static,
) -> Self {
let message: String = message.into();
Self {
message: message.into(),
source: Some(Box::new(source)),
}
}
pub fn build_error_with_report(context: impl Into<String>, report: Report) -> Self {
let context: String = context.into();
let message = format!("{}: {}", context, PrintDiagnostic::new(&report));
Self { message: message.into(), source: None }
}
}
#[cfg(test)]
mod error_assertions {
use super::*;
fn _assert_error_is_send_sync_static<E: core::error::Error + Send + Sync + 'static>(_: E) {}
fn _assert_code_builder_error_bounds(err: CodeBuilderError) {
_assert_error_is_send_sync_static(err);
}
}