zff/header/version2/
segment_header.rs

1// - STD
2use std::cmp::{PartialEq};
3use std::io::{Cursor};
4
5// - internal
6use crate::{
7	Result,
8	HeaderCoding,
9	ValueEncoder,
10	ValueDecoder,
11	HEADER_IDENTIFIER_SEGMENT_HEADER,
12};
13
14/// The [SegmentHeader] contains a lot of initial metadata of the appropriate segment. Each segment has its own segment header.\
15/// The following metadata are included in the [SegmentHeader]:
16/// - The unique identifier value
17/// - the number of the appropriate segment (the first segment starts always with a 1).
18#[derive(Debug,Clone,Eq)]
19pub struct SegmentHeader {
20	version: u8,
21	unique_identifier: i64,
22	segment_number: u64,
23}
24
25impl SegmentHeader {
26	/// returns a new empty [SegmentHeader]
27	pub fn new_empty(version: u8, unique_identifier: i64, segment_number: u64) -> SegmentHeader {
28		Self {
29			version,
30			unique_identifier,
31			segment_number,
32		}
33	}
34	/// returns a new [SegmentHeader] with the given values.
35	pub fn new(version: u8, unique_identifier: i64, segment_number: u64) -> SegmentHeader {
36		Self {
37			version,
38			unique_identifier,
39			segment_number,
40		}
41	}
42
43	/// returns the unique identifier of the zff container (each segment should have the same identifier).
44	pub fn unique_identifier(&self) -> i64 {
45		self.unique_identifier
46	}
47
48	/// returns the number of this segment.
49	pub fn segment_number(&self) -> u64 {
50		self.segment_number
51	}
52
53	/// sets the segment number to the next number. This can be useful, for example,
54	/// if you clone a segment header from the previous one or something like that.
55	pub fn next_header(&self) -> SegmentHeader {
56		SegmentHeader {
57			version: self.version,
58			unique_identifier: self.unique_identifier,
59			segment_number: self.segment_number+1,
60		}
61	}
62}
63
64impl HeaderCoding for SegmentHeader {
65	type Item = SegmentHeader;
66
67	fn identifier() -> u32 {
68		HEADER_IDENTIFIER_SEGMENT_HEADER
69	}
70
71	fn version(&self) -> u8 {
72		self.version
73	}
74	
75	fn encode_header(&self) -> Vec<u8> {
76		let mut vec = Vec::new();
77
78		vec.append(&mut self.version.encode_directly());
79		vec.append(&mut self.unique_identifier.encode_directly());
80		vec.append(&mut self.segment_number.encode_directly());
81		vec
82	}
83
84	fn decode_content(data: Vec<u8>) -> Result<SegmentHeader> {
85		let mut cursor = Cursor::new(data);
86
87		let version = u8::decode_directly(&mut cursor)?;
88		let unique_identifier = i64::decode_directly(&mut cursor)?;
89		let segment_number = u64::decode_directly(&mut cursor)?;
90		Ok(SegmentHeader::new(version, unique_identifier, segment_number))
91	}
92}
93
94impl PartialEq for SegmentHeader {
95    fn eq(&self, other: &Self) -> bool {
96        self.segment_number == other.segment_number
97    }
98}