Skip to main content

async_snmp/
version.rs

1//! SNMP version enumeration.
2
3/// SNMP protocol version.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[non_exhaustive]
6#[derive(Default)]
7pub enum Version {
8    /// `SNMPv1` (RFC 1157)
9    V1,
10    /// `SNMPv2c` (RFC 1901)
11    #[default]
12    V2c,
13    /// `SNMPv3` (RFC 3411-3418)
14    V3,
15}
16
17impl Version {
18    /// Get the BER-encoded version number.
19    ///
20    /// # Examples
21    ///
22    /// ```
23    /// use async_snmp::Version;
24    ///
25    /// assert_eq!(Version::V1.as_i32(), 0);
26    /// assert_eq!(Version::V2c.as_i32(), 1);
27    /// assert_eq!(Version::V3.as_i32(), 3);
28    /// ```
29    #[must_use]
30    pub const fn as_i32(self) -> i32 {
31        match self {
32            Version::V1 => 0,
33            Version::V2c => 1,
34            Version::V3 => 3,
35        }
36    }
37
38    /// Create from BER-encoded version number.
39    ///
40    /// # Examples
41    ///
42    /// ```
43    /// use async_snmp::Version;
44    ///
45    /// assert_eq!(Version::from_i32(0), Some(Version::V1));
46    /// assert_eq!(Version::from_i32(1), Some(Version::V2c));
47    /// assert_eq!(Version::from_i32(3), Some(Version::V3));
48    /// assert_eq!(Version::from_i32(2), None); // Invalid version
49    /// ```
50    #[must_use]
51    pub const fn from_i32(value: i32) -> Option<Self> {
52        match value {
53            0 => Some(Version::V1),
54            1 => Some(Version::V2c),
55            3 => Some(Version::V3),
56            _ => None,
57        }
58    }
59}
60
61impl TryFrom<i32> for Version {
62    type Error = i32;
63
64    fn try_from(value: i32) -> std::result::Result<Self, i32> {
65        Self::from_i32(value).ok_or(value)
66    }
67}
68
69impl std::fmt::Display for Version {
70    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71        match self {
72            Version::V1 => write!(f, "SNMPv1"),
73            Version::V2c => write!(f, "SNMPv2c"),
74            Version::V3 => write!(f, "SNMPv3"),
75        }
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    #[test]
84    fn test_version_try_from() {
85        assert_eq!(Version::try_from(0), Ok(Version::V1));
86        assert_eq!(Version::try_from(1), Ok(Version::V2c));
87        assert_eq!(Version::try_from(3), Ok(Version::V3));
88        assert_eq!(Version::try_from(2), Err(2));
89        assert_eq!(Version::try_from(-1), Err(-1));
90    }
91}