gel_protocol/
features.rs

1#[derive(Clone, Debug, PartialEq, Eq)]
2pub struct ProtocolVersion {
3    pub(crate) major_ver: u16,
4    pub(crate) minor_ver: u16,
5}
6
7impl ProtocolVersion {
8    pub fn current() -> ProtocolVersion {
9        ProtocolVersion {
10            major_ver: 3,
11            minor_ver: 0,
12        }
13    }
14    pub fn new(major_ver: u16, minor_ver: u16) -> ProtocolVersion {
15        ProtocolVersion {
16            major_ver,
17            minor_ver,
18        }
19    }
20    pub fn version_tuple(&self) -> (u16, u16) {
21        (self.major_ver, self.minor_ver)
22    }
23    pub fn is_1(&self) -> bool {
24        self.major_ver >= 1
25    }
26    pub fn is_2(&self) -> bool {
27        self.major_ver >= 2
28    }
29    pub fn is_3(&self) -> bool {
30        self.major_ver >= 3
31    }
32    pub fn supports_inline_typenames(&self) -> bool {
33        self.version_tuple() >= (0, 9)
34    }
35    pub fn has_implicit_tid(&self) -> bool {
36        self.version_tuple() <= (0, 8)
37    }
38    pub fn has_implicit_id(&self) -> bool {
39        // Some of pre 1.0 protocols required implicit id.
40        // Later it was opt out. In 1.0 it's opt-in.
41        // We never opt-in or opt-out so whether it's present only on pre 1.0
42        // portocols.
43        !self.is_1()
44    }
45    pub fn is_multilingual(&self) -> bool {
46        self.is_at_least(3, 0)
47    }
48    pub fn is_at_least(&self, major_ver: u16, minor_ver: u16) -> bool {
49        self.major_ver > major_ver || self.major_ver == major_ver && self.minor_ver >= minor_ver
50    }
51    pub fn is_at_most(&self, major_ver: u16, minor_ver: u16) -> bool {
52        self.major_ver < major_ver || self.major_ver == major_ver && self.minor_ver <= minor_ver
53    }
54}