use std::ffi::CStr;
use std::os::raw::c_char;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum AtfitsError {
#[error("FITS I/O error: {0}")]
Fits(#[from] fitsio::errors::Error),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("missing header keyword: {0}")]
MissingKeyword(String),
#[error("target axis missing: {0}")]
TargetAxisMissing(String),
#[error("unsupported NAXIS={0}")]
UnsupportedNaxis(i64),
#[error("{0}")]
Other(String),
}
pub type Result<T> = std::result::Result<T, AtfitsError>;
pub fn status_message(status: i32) -> String {
let mut buf = [0 as c_char; 31];
unsafe {
fitsio::sys::ffgerr(status, buf.as_mut_ptr());
CStr::from_ptr(buf.as_ptr()).to_string_lossy().into_owned()
}
}
pub fn is_reentrant() -> bool {
unsafe { fitsio::sys::fits_is_reentrant() != 0 }
}
pub(crate) fn ffcall(f: impl FnOnce(&mut i32) -> i32) -> Result<()> {
let mut status = 0;
f(&mut status);
fitsio::errors::check_status(status)?;
Ok(())
}