m8_file_parser/
version.rs1use crate::{reader::*, writer::Writer};
2
3use std::fmt;
4
5#[derive(PartialEq, Clone, Copy)]
6pub struct Version {
7 pub major: u8,
8 pub minor: u8,
9 pub patch: u8,
10}
11
12impl Default for Version {
13 fn default() -> Self {
14 Self {
15 major: 4,
16 minor: 0,
17 patch: 0,
18 }
19 }
20}
21
22impl fmt::Display for Version {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 write!(f, "{}.{}.{}", self.major, self.minor, self.patch)
25 }
26}
27
28impl fmt::Debug for Version {
29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30 write!(f, "{}", &self)
31 }
32}
33
34impl Version {
35 pub const SIZE: usize = 14;
36
37 pub fn write(&self, w: &mut Writer) {
38 w.write(self.major);
39 w.write((self.minor << 4) | self.patch);
40 w.write(0);
41 w.write(0);
42 }
43
44 pub fn from_reader(reader: &mut Reader) -> M8Result<Self> {
45 let _version_string = reader.read_bytes(10);
46 let lsb = reader.read();
47 let msb = reader.read();
48 let major = msb & 0x0F;
49 let minor = (lsb >> 4) & 0x0F;
50 let patch = lsb & 0x0F;
51
52 reader.read_bytes(2); Ok(Self {
54 major,
55 minor,
56 patch,
57 })
58 }
59
60 pub fn at_least(&self, major: u8, minor: u8) -> bool {
61 self.major > major || (self.major == major && self.minor >= minor)
62 }
63}