1use serde::{Deserialize, Serialize};
19use std::fmt;
20
21#[derive(Debug, PartialEq, Hash, Eq, Copy, Clone, Serialize, Deserialize)]
23#[non_exhaustive]
24pub enum Version {
25 None,
27 Simple { major: u16, minor: u8 },
29 }
31
32impl Version {
33 pub const fn new_raw(value: u16) -> Self {
34 match value {
35 0xffff => Version::None,
36 x => Version::Simple {
37 major: x / 100,
38 minor: (x % 100) as u8,
39 },
40 }
41 }
42
43 pub const fn new(major: u16, minor: u8) -> Self {
44 Version::Simple { major, minor }
45 }
46
47 pub const fn value(&self) -> u16 {
48 match self {
49 Version::None => 0xffff,
50 Version::Simple { major, minor } => (*major * 100) + *minor as u16,
51 }
52 }
53}
54
55impl fmt::Display for Version {
56 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
57 match self {
58 Version::None => write!(f, "0.0"),
59 Version::Simple { major, minor } => {
60 write!(f, "{}.{}", major, minor)
61 }
62 }
63 }
64}
65
66impl From<u16> for Version {
67 fn from(x: u16) -> Self {
68 Version::new_raw(x)
69 }
70}
71
72impl From<u8> for Version {
73 fn from(x: u8) -> Self {
74 Version::new_raw(x as u16)
75 }
76}
77
78impl From<Version> for u16 {
79 fn from(x: Version) -> u16 {
80 x.value()
81 }
82}