use std::fs::File;
use std::io::Result;
use polars::frame::DataFrame;
use crate::io::hdus::bintable::bintable::*;
use crate::io::header::card::Card;
use crate::io::Header;
const MANDATORY_KEYWORDS: [&str; 5] = [
"XTENSION",
"BITPIX",
"NAXIS",
"NAXIS1",
"NAXIS2",
];
pub struct BinTableHDU{
pub header: Header,
pub data: DataFrame,
}
impl BinTableHDU {
pub fn new(header: Header, data: DataFrame) -> Self {
Self {
header,
data,
}
}
pub fn new_data(data: DataFrame) -> Self {
let mut header = Header::new();
header.add_card(&Card::new("XTENSION".to_string(), "BINTABLE".to_string(), Some("Binary table".to_string())));
Self {
header,
data,
}
}
pub fn read_from_file(f: &mut File) -> Result<Self> {
let mut header = Header::new();
header.read_from_file(f)?;
let mut columns = read_tableinfo_from_header(&header).unwrap();
let df = read_table_bytes_to_df(&mut columns, &header, f);
Ok(Self::new(header, df?))
}
pub fn write_to_file(&mut self, mut f: &mut File) -> Result<()> {
self.header.fix_header_w_mandatory_order(&MANDATORY_KEYWORDS);
let columns = polars_to_columns(&self.data).unwrap();
create_table_on_header(&mut self.header, &columns, self.data.height() as i64);
self.header.fix_header_w_mandatory_order(&MANDATORY_KEYWORDS);
self.header.write_to_buffer(&mut f)?;
df_to_buffer(columns, &self.data, f)?;
Ok(())
}
}