nitf_rs/headers/
reserved_extension_hdr.rs

1//! Reserved Extension segment subheader definition
2use std::fmt::Display;
3use std::io::{Read, Seek, Write};
4use std::str::FromStr;
5
6use crate::headers::NitfSegmentHeader;
7use crate::types::{ExtendedSubheader, NitfField, Security};
8use crate::{NitfError, NitfResult};
9/// Metadata for Reserved Extension Segment
10#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
11pub struct ReservedExtensionHeader {
12    /// File Part Type
13    pub re: NitfField<RE>,
14    /// Unique RES Type Identifier
15    pub resid: NitfField<String>,
16    /// Version of the Data Definition
17    pub resver: NitfField<u8>,
18    /// Security information
19    pub security: Security,
20    /// User-defined Subheader Length
21    pub resshl: NitfField<u16>,
22    /// User-Defined Subheader Fields
23    pub resshf: ExtendedSubheader,
24}
25impl Default for ReservedExtensionHeader {
26    fn default() -> Self {
27        Self {
28            re: NitfField::init(2u8, "RE"),
29            resid: NitfField::init(25u8, "RESID"),
30            resver: NitfField::init(2u8, "RESVER"),
31            security: Security::default(),
32            resshl: NitfField::init(4u8, "RESSHL"),
33            resshf: ExtendedSubheader::init("RESSHF"),
34        }
35    }
36}
37#[derive(Default, Clone, Debug, Eq, PartialEq, Copy, Ord, PartialOrd)]
38pub enum RE {
39    #[default]
40    RE,
41}
42impl FromStr for RE {
43    type Err = NitfError;
44    fn from_str(s: &str) -> Result<Self, Self::Err> {
45        match s {
46            "RE" => Ok(Self::default()),
47            _ => Err(NitfError::ParseError("RE".to_string())),
48        }
49    }
50}
51impl Display for RE {
52    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
53        write!(f, "RE")
54    }
55}
56impl Display for ReservedExtensionHeader {
57    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
58        let mut out_str = String::default();
59        out_str += format!("{}, ", self.re).as_ref();
60        out_str += format!("{}, ", self.resid).as_ref();
61        out_str += format!("{}, ", self.resver).as_ref();
62        out_str += format!("SECURITY: [{}], ", self.security).as_ref();
63        out_str += format!("{}, ", self.resshl).as_ref();
64        out_str += format!("{}, ", self.resshf).as_ref();
65        write!(f, "Reserved Extension Segment: [{out_str}]")
66    }
67}
68impl NitfSegmentHeader for ReservedExtensionHeader {
69    fn read(&mut self, reader: &mut (impl Read + Seek)) -> NitfResult<()> {
70        self.re.read(reader)?;
71        self.resid.read(reader)?;
72        self.resver.read(reader)?;
73        self.security.read(reader)?;
74        self.resshl.read(reader)?;
75        if self.resshl.val != 0 {
76            self.resshf.read(reader, self.resshl.val as usize)?;
77        }
78        Ok(())
79    }
80    fn write(&self, writer: &mut (impl Write + Seek)) -> NitfResult<usize> {
81        let mut bytes_written = 0;
82        bytes_written += self.re.write(writer)?;
83        bytes_written += self.resid.write(writer)?;
84        bytes_written += self.resver.write(writer)?;
85        bytes_written += self.security.write(writer)?;
86        bytes_written += self.resshl.write(writer)?;
87        if self.resshl.val != 0 {
88            bytes_written += self.resshf.write(writer)?;
89        }
90        Ok(bytes_written)
91    }
92    fn length(&self) -> usize {
93        let mut length = 0;
94        length += self.re.length;
95        length += self.resid.length;
96        length += self.resver.length;
97        length += self.security.length();
98        length += self.resshl.length;
99        if self.resshl.val != 0 {
100            length += self.resshf.size();
101        }
102        length
103    }
104}