1use std::fmt::{Debug, Formatter};
2
3#[derive(PartialEq)]
4pub struct Version(u16);
5
6impl Version {
7 pub const TLS_1_0: Version = Version(0x301);
8 pub const TLS_1_1: Version = Version(0x302);
9 pub const TLS_1_2: Version = Version(0x303);
10 pub const TLS_1_3: Version = Version(0x304);
11}
12
13impl Version {
14 pub fn new(v: u16) -> Version {
15 Version(v)
16 }
17
18 pub fn into_inner(self) -> u16 { self.0 }
19
20 pub(crate) fn as_u16(&self) -> u16 {
21 self.0
22 }
23
24 pub(crate) fn as_ja4_str(&self) -> &'static str {
25 match self.0 {
26 0x301 => "10",
27 0x302 => "11",
28 0x303 => "12",
29 0x304 => "13",
30 _ => ""
31 }
32 }
33
34 pub(crate) fn is_reverse(&self) -> bool {
35 !matches!(self.0, 0x301..=0x304)
36 }
37}
38
39impl Debug for Version {
40 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
41 match self.0 {
42 0x301 => write!(f, "TLS_1_0(0x{:x})", self.0),
43 0x302 => write!(f, "TLS_1_1(0x{:x})", self.0),
44 0x303 => write!(f, "TLS_1_2(0x{:x})", self.0),
45 0x304 => write!(f, "TLS_1_3(0x{:x})", self.0),
46 _ => write!(f, "Reserved({})", self.0)
47 }
48 }
49}