use libc::size_t;
pub struct fluxio_error(crate::Error);
#[repr(C)]
pub enum fluxio_code {
FLUXIO_OK,
FLUXIO_ERROR,
FLUXIO_INVALID_ARG,
FLUXIO_UNEXPECTED_EOF,
FLUXIO_ABORTED_BY_CALLBACK,
#[cfg_attr(feature = "http2", allow(unused))]
FLUXIO_FEATURE_NOT_ENABLED,
FLUXIO_INVALID_PEER_MESSAGE,
}
impl fluxio_error {
fn code(&self) -> fluxio_code {
use crate::error::Kind as ErrorKind;
use crate::error::User;
match self.0.kind() {
ErrorKind::Parse(_) => fluxio_code::FLUXIO_INVALID_PEER_MESSAGE,
ErrorKind::IncompleteMessage => fluxio_code::FLUXIO_UNEXPECTED_EOF,
ErrorKind::User(User::AbortedByCallback) => fluxio_code::FLUXIO_ABORTED_BY_CALLBACK,
_ => fluxio_code::FLUXIO_ERROR,
}
}
fn print_to(&self, dst: &mut [u8]) -> usize {
use std::io::Write;
let mut dst = std::io::Cursor::new(dst);
let _ = write!(dst, "{}", &self.0);
dst.position() as usize
}
}
ffi_fn! {
fn fluxio_error_free(err: *mut fluxio_error) {
drop(non_null!(Box::from_raw(err) ?= ()));
}
}
ffi_fn! {
fn fluxio_error_code(err: *const fluxio_error) -> fluxio_code {
non_null!(&*err ?= fluxio_code::FLUXIO_INVALID_ARG).code()
}
}
ffi_fn! {
fn fluxio_error_print(err: *const fluxio_error, dst: *mut u8, dst_len: size_t) -> size_t {
let dst = unsafe {
std::slice::from_raw_parts_mut(dst, dst_len)
};
non_null!(&*err ?= 0).print_to(dst)
}
}