use std::fmt::Display;
use std::fs::File;
use std::str::FromStr;
use crate::error::NitfError;
use crate::headers::NitfSegmentHeader;
use crate::types::{NitfField, Security, ExtendedSubheader};
#[derive(Default, Clone, Debug, Eq, PartialEq)]
pub struct DataExtensionHeader {
pub de: NitfField<String>,
pub desid: NitfField<String>,
pub desver: NitfField<u8>,
pub security: Security,
pub desoflw: NitfField<OverflowedHeaderType>,
pub desitem: NitfField<u16>,
pub desshl: NitfField<u16>,
pub desshf: ExtendedSubheader,
}
#[derive(Debug, Default, Clone, Eq, PartialEq)]
pub enum OverflowedHeaderType {
#[default]
IXSHD,
SXSHD,
TXSHD,
UDHD,
UDID,
}
impl NitfSegmentHeader for DataExtensionHeader {
fn read(&mut self, reader: &mut File) {
self.de.read(reader, 2u8);
self.desid.read(reader, 25u8);
self.desver.read(reader, 2u8);
self.security.read(reader);
if self.desid.string.trim() == "TRE_OVERFLOW" {
self.desoflw.read(reader, 6u8);
self.desitem.read(reader, 3u8);
}
self.desshl.read(reader, 4u8);
if self.desshl.val != 0 {
self.desshf.read(reader, self.desshl.val as usize);
}
}
}
impl Display for DataExtensionHeader {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut out_str = String::default();
out_str += format!("DE: {}, ", self.de).as_ref();
out_str += format!("DESID: {}, ", self.desid).as_ref();
out_str += format!("DESVER: {}, ", self.desver).as_ref();
out_str += format!("SECURITY: [{}], ", self.security).as_ref();
out_str += format!("DESOFLW: {}, ", self.desoflw).as_ref();
out_str += format!("DESITEM: {}, ", self.desitem).as_ref();
out_str += format!("DESSHL: {}, ", self.desshl).as_ref();
out_str += format!("DESSHF: {}", self.desshf).as_ref();
write!(f, "[Data Extension Subheader: {out_str}]")
}
}
impl FromStr for OverflowedHeaderType {
type Err = NitfError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"IXSHD" => Ok(Self::IXSHD),
"SXSHD" => Ok(Self::SXSHD),
"TXSHD" => Ok(Self::TXSHD),
"UDHD" => Ok(Self::UDHD),
"UDID" => Ok(Self::UDID),
_ => Err(NitfError::FieldError),
}
}
}