use std::os::raw::c_long;
use static_assertions::const_assert;
use crate::bindgen::{
COR_E_INVALIDOPERATION, COR_E_IO, E_INVALIDARG, E_OK, E_OUTOFMEMORY, E_POINTER, E_UNEXPECTED,
};
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum Error {
#[error("The operation completed successfully")]
Ok,
#[error("The argument is not valid")]
InvalidArgument,
#[error("Invalid pointer")]
InvalidPointer,
#[error("Out of memory")]
OutOfMemory,
#[error("Unexpected")]
Unexpected,
#[error("Internal error {0}")]
InternalError(c_long),
#[error("Unknown {0}")]
Unknown(c_long),
#[error("Polynomial degree not set")]
DegreeNotSet,
#[error("Coefficient modulus not set")]
CoefficientModulusNotSet,
#[error("Plain modulus not set")]
PlainModulusNotSet,
#[error("Cannot reduce the modulus from a set size of 1 to 0")]
ModulusChainTooSmall,
#[error("Serialization failed {0}")]
SerializationError(Box<String>),
}
const_assert!(std::mem::size_of::<Error>() <= 16);
impl From<c_long> for Error {
fn from(err: c_long) -> Self {
match err {
E_OK => Error::Ok,
E_POINTER => Error::InvalidPointer,
E_INVALIDARG => Error::InvalidArgument,
E_OUTOFMEMORY => Error::OutOfMemory,
E_UNEXPECTED => Error::Unexpected,
COR_E_IO => Error::InternalError(err),
COR_E_INVALIDOPERATION => Error::InternalError(err),
_ => Error::Unknown(err),
}
}
}
pub type Result<T> = std::result::Result<T, Error>;
pub fn convert_seal_error(err: c_long) -> Result<()> {
if err == E_OK {
Ok(())
} else {
Err(Error::from(err))
}
}