1use crate::Error;
4use der::{Decode, Encode, FixedTag, Reader, Tag, Tagged, Writer};
5
6#[derive(Clone, Debug, Copy, PartialEq, Eq)]
10pub enum Version {
11 V1 = 0,
13
14 V2 = 1,
16}
17
18impl Version {
19 #[must_use]
21 pub fn has_public_key(self) -> bool {
22 match self {
23 Version::V1 => false,
24 Version::V2 => true,
25 }
26 }
27}
28
29impl<'a> Decode<'a> for Version {
30 type Error = der::Error;
31
32 fn decode<R: Reader<'a>>(reader: &mut R) -> der::Result<Self> {
33 Version::try_from(u8::decode(reader)?).map_err(|_| reader.error(Self::TAG.value_error()))
34 }
35}
36
37impl Encode for Version {
38 fn encoded_len(&self) -> der::Result<der::Length> {
39 der::Length::from(1u8).for_tlv(self.tag())
40 }
41
42 fn encode(&self, writer: &mut impl Writer) -> der::Result<()> {
43 u8::from(*self).encode(writer)
44 }
45}
46
47impl From<Version> for u8 {
48 fn from(version: Version) -> Self {
49 version as u8
50 }
51}
52
53impl TryFrom<u8> for Version {
54 type Error = Error;
55 fn try_from(byte: u8) -> Result<Version, Error> {
56 match byte {
57 0 => Ok(Version::V1),
58 1 => Ok(Version::V2),
59 _ => Err(Self::TAG.value_error().into()),
60 }
61 }
62}
63
64impl FixedTag for Version {
65 const TAG: Tag = Tag::Integer;
66}