zff/header/version2/
segment_header.rs1use std::cmp::{PartialEq};
3use std::io::{Cursor};
4
5use crate::{
7 Result,
8 HeaderCoding,
9 ValueEncoder,
10 ValueDecoder,
11 HEADER_IDENTIFIER_SEGMENT_HEADER,
12};
13
14#[derive(Debug,Clone,Eq)]
19pub struct SegmentHeader {
20 version: u8,
21 unique_identifier: i64,
22 segment_number: u64,
23}
24
25impl SegmentHeader {
26 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 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 pub fn unique_identifier(&self) -> i64 {
45 self.unique_identifier
46 }
47
48 pub fn segment_number(&self) -> u64 {
50 self.segment_number
51 }
52
53 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}