fitsrs/hdu/header/extension/
image.rs1use async_trait::async_trait;
2use serde::Serialize;
3
4use crate::error::Error;
5use crate::hdu::header::Bitpix;
6
7use crate::hdu::header::ValueMap;
8use crate::hdu::header::Xtension;
9
10#[derive(Debug, PartialEq, Serialize, Clone)]
11pub struct Image {
12 bitpix: Bitpix,
14 naxisn: Box<[u64]>,
16}
17
18impl Image {
19 pub fn get_naxis(&self) -> &[u64] {
21 &self.naxisn
22 }
23
24 pub fn get_bitpix(&self) -> Bitpix {
26 self.bitpix
27 }
28
29 pub fn get_num_pixels(&self) -> u64 {
31 if self.naxisn.is_empty() {
32 return 0;
33 }
34 self.naxisn.iter().product()
35 }
36}
37
38#[async_trait(?Send)]
39impl Xtension for Image {
40 fn get_num_bytes_data_block(&self) -> u64 {
41 self.bitpix.byte_size() as u64 * self.get_num_pixels()
42 }
43
44 fn parse(values: &ValueMap) -> Result<Self, Error> {
45 let bitpix = values.check_for_bitpix()?;
47 let naxis = values.check_for_naxis()? as usize;
49 let naxisn = (1..=naxis)
51 .map(|naxis_i| values.check_for_naxisi(naxis_i))
52 .collect::<Result<_, _>>()?;
53
54 Ok(Image { bitpix, naxisn })
55 }
56}