zerodds_corba_giop/
version.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
8pub struct Version {
9 pub major: u8,
11 pub minor: u8,
13}
14
15impl Version {
16 pub const V1_0: Self = Self { major: 1, minor: 0 };
18 pub const V1_1: Self = Self { major: 1, minor: 1 };
20 pub const V1_2: Self = Self { major: 1, minor: 2 };
22
23 #[must_use]
25 pub const fn new(major: u8, minor: u8) -> Self {
26 Self { major, minor }
27 }
28
29 #[must_use]
33 pub const fn supports_fragments(self) -> bool {
34 self.is_at_least(1, 1)
35 }
36
37 #[must_use]
40 pub const fn supports_universal_fragments(self) -> bool {
41 self.is_at_least(1, 2)
42 }
43
44 #[must_use]
47 pub const fn uses_flags_octet(self) -> bool {
48 self.is_at_least(1, 1)
49 }
50
51 #[must_use]
55 pub const fn uses_v1_2_request_layout(self) -> bool {
56 self.is_at_least(1, 2)
57 }
58
59 #[must_use]
62 pub const fn supports_bidirectional(self) -> bool {
63 self.is_at_least(1, 2)
64 }
65
66 #[must_use]
68 pub const fn is_at_least(self, major: u8, minor: u8) -> bool {
69 if self.major > major {
70 true
71 } else if self.major == major {
72 self.minor >= minor
73 } else {
74 false
75 }
76 }
77}
78
79#[cfg(test)]
80#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
81mod tests {
82 use super::*;
83
84 #[test]
85 fn version_constants_match_spec() {
86 assert_eq!(Version::V1_0, Version::new(1, 0));
87 assert_eq!(Version::V1_1, Version::new(1, 1));
88 assert_eq!(Version::V1_2, Version::new(1, 2));
89 }
90
91 #[test]
92 fn fragment_support_starts_at_1_1() {
93 assert!(!Version::V1_0.supports_fragments());
94 assert!(Version::V1_1.supports_fragments());
95 assert!(Version::V1_2.supports_fragments());
96 }
97
98 #[test]
99 fn universal_fragments_only_in_1_2() {
100 assert!(!Version::V1_0.supports_universal_fragments());
101 assert!(!Version::V1_1.supports_universal_fragments());
102 assert!(Version::V1_2.supports_universal_fragments());
103 }
104
105 #[test]
106 fn flags_octet_replaces_byte_order_at_1_1() {
107 assert!(!Version::V1_0.uses_flags_octet());
108 assert!(Version::V1_1.uses_flags_octet());
109 assert!(Version::V1_2.uses_flags_octet());
110 }
111
112 #[test]
113 fn v1_2_request_layout_only_in_1_2_plus() {
114 assert!(!Version::V1_0.uses_v1_2_request_layout());
115 assert!(!Version::V1_1.uses_v1_2_request_layout());
116 assert!(Version::V1_2.uses_v1_2_request_layout());
117 }
118
119 #[test]
120 fn bidirectional_starts_at_1_2() {
121 assert!(!Version::V1_0.supports_bidirectional());
122 assert!(!Version::V1_1.supports_bidirectional());
123 assert!(Version::V1_2.supports_bidirectional());
124 }
125
126 #[test]
127 fn version_ordering_works() {
128 assert!(Version::V1_0 < Version::V1_1);
129 assert!(Version::V1_1 < Version::V1_2);
130 }
131}