nitf_rs/headers/
reserved_extension_hdr.rs1use 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#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
11pub struct ReservedExtensionHeader {
12 pub re: NitfField<RE>,
14 pub resid: NitfField<String>,
16 pub resver: NitfField<u8>,
18 pub security: Security,
20 pub resshl: NitfField<u16>,
22 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}