use async_trait::async_trait;
use serde::Serialize;
use crate::error::Error;
use crate::hdu::header::Bitpix;
use crate::hdu::header::ValueMap;
use crate::hdu::header::Xtension;
#[derive(Debug, PartialEq, Serialize, Clone)]
pub struct Image {
bitpix: Bitpix,
naxisn: Box<[u64]>,
}
impl Image {
pub fn get_naxis(&self) -> &[u64] {
&self.naxisn
}
pub fn get_bitpix(&self) -> Bitpix {
self.bitpix
}
pub fn get_num_pixels(&self) -> u64 {
if self.naxisn.is_empty() {
return 0;
}
self.naxisn.iter().product()
}
}
#[async_trait(?Send)]
impl Xtension for Image {
fn get_num_bytes_data_block(&self) -> u64 {
self.bitpix.byte_size() as u64 * self.get_num_pixels()
}
fn parse(values: &ValueMap) -> Result<Self, Error> {
let bitpix = values.check_for_bitpix()?;
let naxis = values.check_for_naxis()? as usize;
let naxisn = (1..=naxis)
.map(|naxis_i| values.check_for_naxisi(naxis_i))
.collect::<Result<_, _>>()?;
Ok(Image { bitpix, naxisn })
}
}