use std::ffi::CString;
use std::path::Path;
use fitsio::FitsFile;
use fitsio::errors::check_status;
use crate::error::{AtfitsError, Result};
pub(crate) fn cstr(s: &str) -> Result<CString> {
CString::new(s).map_err(|e| AtfitsError::Other(format!("invalid C string {s:?}: {e}")))
}
pub fn update_key_i64(fptr: &mut FitsFile, name: &str, value: i64) -> Result<()> {
let c_name = cstr(name)?;
let mut status = 0;
unsafe {
fitsio::sys::ffukyj(
fptr.as_raw(),
c_name.as_ptr(),
value,
std::ptr::null_mut(),
&mut status,
);
}
check_status(status)?;
Ok(())
}
pub fn update_key_f64(fptr: &mut FitsFile, name: &str, value: f64) -> Result<()> {
let c_name = cstr(name)?;
let mut status = 0;
unsafe {
fitsio::sys::ffukyd(
fptr.as_raw(),
c_name.as_ptr(),
value,
-15,
std::ptr::null_mut(),
&mut status,
);
}
check_status(status)?;
Ok(())
}
pub fn update_key_str(fptr: &mut FitsFile, name: &str, value: &str) -> Result<()> {
let c_name = cstr(name)?;
let c_val = cstr(value)?;
let mut status = 0;
unsafe {
fitsio::sys::ffukys(
fptr.as_raw(),
c_name.as_ptr(),
c_val.as_ptr(),
std::ptr::null_mut(),
&mut status,
);
}
check_status(status)?;
Ok(())
}
pub fn update_key_logical(fptr: &mut FitsFile, name: &str, value: bool) -> Result<()> {
let c_name = cstr(name)?;
let mut status = 0;
unsafe {
fitsio::sys::ffukyl(
fptr.as_raw(),
c_name.as_ptr(),
value as std::os::raw::c_int,
std::ptr::null_mut(),
&mut status,
);
}
check_status(status)?;
Ok(())
}
pub fn delete_key(fptr: &mut FitsFile, name: &str) -> Result<()> {
let c_name = cstr(name)?;
let mut status = 0;
unsafe {
fitsio::sys::ffdkey(fptr.as_raw(), c_name.as_ptr(), &mut status);
}
if status == 202 {
return Ok(());
}
check_status(status)?;
Ok(())
}
pub fn write_comment(fptr: &mut FitsFile, comment: &str) -> Result<()> {
let c_comment = cstr(comment)?;
let mut status = 0;
unsafe {
fitsio::sys::ffpcom(fptr.as_raw(), c_comment.as_ptr(), &mut status);
}
check_status(status)?;
Ok(())
}
pub fn read_key_f64(path: &Path, key: &str) -> Result<Option<f64>> {
let mut fptr = FitsFile::open(path.to_string_lossy().as_ref())?;
let hdu = fptr.primary_hdu()?;
Ok(hdu.read_key::<f64>(&mut fptr, key).ok())
}
pub fn read_key_string(path: &Path, key: &str) -> Result<Option<String>> {
let mut fptr = FitsFile::open(path.to_string_lossy().as_ref())?;
let hdu = fptr.primary_hdu()?;
Ok(hdu.read_key::<String>(&mut fptr, key).ok())
}
pub fn has_key(path: &Path, key: &str) -> Result<bool> {
let mut fptr = FitsFile::open(path.to_string_lossy().as_ref())?;
let hdu = fptr.primary_hdu()?;
Ok(hdu.read_key::<String>(&mut fptr, key).is_ok()
|| hdu.read_key::<f64>(&mut fptr, key).is_ok())
}