use hypervectorscan_sys as ffi;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("Pattern expression contains NUL byte")]
Nul(#[from] std::ffi::NulError),
#[error("Error originating from Hyperscan API")]
Hyperscan(HyperscanErrorCode),
#[error("Pattern comilation failed, {0} at {1}")]
HyperscanCompile(String, i32),
}
#[repr(i32)]
#[derive(Debug, PartialEq, Eq)]
pub enum HyperscanErrorCode {
Invalid = ffi::HS_INVALID,
Nomem = ffi::HS_NOMEM,
ScanTerminated = ffi::HS_SCAN_TERMINATED,
CompilerError = ffi::HS_COMPILER_ERROR,
DbVersionError = ffi::HS_DB_VERSION_ERROR,
DbPlatformError = ffi::HS_DB_PLATFORM_ERROR,
DbModeError = ffi::HS_DB_MODE_ERROR,
BadAlign = ffi::HS_BAD_ALIGN,
BadAlloc = ffi::HS_BAD_ALLOC,
ScratchInUse = ffi::HS_SCRATCH_IN_USE,
ArchError = ffi::HS_ARCH_ERROR,
InsufficientSpace = ffi::HS_INSUFFICIENT_SPACE,
UnknownError = ffi::HS_UNKNOWN_ERROR,
UnknownErrorCode = -100,
}
impl From<ffi::hs_error_t> for HyperscanErrorCode {
fn from(err: ffi::hs_error_t) -> Self {
if (-13..=-1).contains(&err) {
unsafe { std::mem::transmute::<i32, HyperscanErrorCode>(err) }
} else {
Self::UnknownErrorCode
}
}
}
impl From<ffi::hs_error_t> for Error {
fn from(err: ffi::hs_error_t) -> Self {
Error::Hyperscan(err.into())
}
}
pub trait AsResult: Sized {
fn ok(self) -> Result<(), Error>;
}
impl AsResult for ffi::hs_error_t {
fn ok(self) -> Result<(), Error> {
if self == ffi::HS_SUCCESS as ffi::hs_error_t {
Ok(())
} else {
Err(self.into())
}
}
}