Skip to main content

native/egglog_nif/src/error.rs

use rustler::{Encoder, Env, Term};

use crate::atoms;

pub enum NativeError {
    Closed(String),
    InvalidTheory(String),
    Native(String),
}

impl NativeError {
    pub fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
        match self {
            Self::Closed(message) => (atoms::error(), atoms::closed(), message).encode(env),
            Self::InvalidTheory(message) => {
                (atoms::error(), atoms::invalid_theory(), message).encode(env)
            }
            Self::Native(message) => (atoms::error(), atoms::native_error(), message).encode(env),
        }
    }
}

impl From<String> for NativeError {
    fn from(message: String) -> Self {
        Self::Native(message)
    }
}

pub fn panic_payload_to_string(payload: Box<dyn std::any::Any + Send>) -> String {
    if let Some(message) = payload.downcast_ref::<&str>() {
        (*message).to_string()
    } else if let Some(message) = payload.downcast_ref::<String>() {
        message.clone()
    } else {
        "native panic".to_string()
    }
}