use crate::contract::object::ObjectError;
use sapio_base::effects::EffectDBError;
use sapio_base::effects::EffectPath;
use sapio_base::effects::ValidFragmentError;
use sapio_base::plugin_args::CreateArgs;
use sapio_base::simp::SIMPError;
use sapio_ctv_emulator_trait::EmulatorError;
use std::collections::LinkedList;
use std::error::Error;
use std::fmt;
type ErrT = Box<dyn std::error::Error>;
#[derive(Debug)]
pub enum CompilationError {
AdditionalGuardsNotAllowedHere,
TerminateCompilation,
TerminateWith(String),
OverwriteMetadata(String),
MinFeerateError,
ContexPathAlreadyDerived,
InvalidPathName,
PathFragmentError(ValidFragmentError),
MissingTemplates,
EmptyPolicy,
OutOfFunds,
IncompatibleSequence,
IncompatibleLockTime,
NoSuchSequence,
ParseAmountError(bitcoin::util::amount::ParseAmountError),
Miniscript(miniscript::policy::compiler::CompilerError),
MiniscriptE(miniscript::Error),
TimeLockError(sapio_base::timelocks::LockTimeError),
CompiledObjectError(ObjectError),
ConditionalCompilationFailed(LinkedList<String>),
EffectDBError(EffectDBError),
SIMPError(SIMPError),
UnknownModule,
InvalidModule,
InternalModuleError(String),
ModuleFailedToGetMemory(ErrT),
ModuleCouldNotAllocateError(i32, ErrT),
ModuleCouldNotFindFunction(String),
ModuleCouldNotDeallocate(i32, ErrT),
ModuleCouldNotCreateContract(EffectPath, CreateArgs<serde_json::Value>, ErrT),
ModuleCouldNotGetAPI(ErrT),
ModuleCouldNotGetLogo(ErrT),
ModuleCouldNotGetName(ErrT),
ModuleRuntimeError(ErrT),
ModuleFailedAPICheck(String),
ModuleCompilationErrorUnsendable(String),
SerializationError(serde_json::Error),
DeserializationError(serde_json::Error),
WebAPIDisabled,
Custom(Box<dyn std::error::Error>),
ContinuationCoercion(String),
}
impl From<SIMPError> for CompilationError {
fn from(e: SIMPError) -> CompilationError {
CompilationError::SIMPError(e)
}
}
impl From<ValidFragmentError> for CompilationError {
fn from(e: ValidFragmentError) -> CompilationError {
CompilationError::PathFragmentError(e)
}
}
impl From<EffectDBError> for CompilationError {
fn from(e: EffectDBError) -> CompilationError {
CompilationError::EffectDBError(e)
}
}
impl From<std::convert::Infallible> for CompilationError {
fn from(_s: std::convert::Infallible) -> CompilationError {
unimplemented!("Impossible, Just to make Type System Happy...");
}
}
impl CompilationError {
pub fn custom<E: std::error::Error + 'static>(e: E) -> Self {
CompilationError::Custom(Box::new(e))
}
}
impl From<bitcoin::util::amount::ParseAmountError> for CompilationError {
fn from(b: bitcoin::util::amount::ParseAmountError) -> Self {
CompilationError::ParseAmountError(b)
}
}
impl From<sapio_base::timelocks::LockTimeError> for CompilationError {
fn from(b: sapio_base::timelocks::LockTimeError) -> Self {
CompilationError::TimeLockError(b)
}
}
impl From<miniscript::policy::compiler::CompilerError> for CompilationError {
fn from(v: miniscript::policy::compiler::CompilerError) -> Self {
CompilationError::Miniscript(v)
}
}
impl From<miniscript::Error> for CompilationError {
fn from(v: miniscript::Error) -> Self {
CompilationError::MiniscriptE(v)
}
}
impl From<ObjectError> for CompilationError {
fn from(e: ObjectError) -> Self {
CompilationError::CompiledObjectError(e)
}
}
impl fmt::Display for CompilationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl Error for CompilationError {}
impl From<EmulatorError> for CompilationError {
fn from(e: EmulatorError) -> Self {
CompilationError::Custom(Box::new(e))
}
}