nullnet_firewall/
firewall_direction.rs

1use std::fmt::{Display, Formatter};
2
3use rusqlite::types::ToSqlOutput;
4use rusqlite::ToSql;
5
6use crate::FirewallError;
7
8/// Direction of a firewall rule.
9///
10/// Each firewall rule is associated to a given direction.
11#[derive(Debug, Eq, PartialEq, Clone)]
12pub enum FirewallDirection {
13    /// Refers to incoming network traffic.
14    IN,
15    /// Refers to outgoing network traffic.
16    OUT,
17}
18
19impl FirewallDirection {
20    pub(crate) fn from_str_with_line(l: usize, s: &str) -> Result<Self, FirewallError> {
21        match s {
22            "IN" => Ok(Self::IN),
23            "OUT" => Ok(Self::OUT),
24            x => Err(FirewallError::InvalidDirection(l, x.to_owned())),
25        }
26    }
27}
28
29impl Display for FirewallDirection {
30    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
31        write!(f, "{self:?}")
32    }
33}
34
35impl ToSql for FirewallDirection {
36    fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
37        Ok(self.to_string().into())
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use rusqlite::types::ToSqlOutput;
44    use rusqlite::types::Value::Text;
45    use rusqlite::ToSql;
46
47    use crate::{FirewallDirection, FirewallError};
48
49    #[test]
50    fn test_firewall_directions_from_str() {
51        assert_eq!(
52            FirewallDirection::from_str_with_line(1, "IN"),
53            Ok(FirewallDirection::IN)
54        );
55        assert_eq!(
56            FirewallDirection::from_str_with_line(1, "OUT"),
57            Ok(FirewallDirection::OUT)
58        );
59
60        let err = FirewallDirection::from_str_with_line(3, "UNDER").unwrap_err();
61        assert_eq!(err, FirewallError::InvalidDirection(3, "UNDER".to_owned()));
62        assert_eq!(
63            err.to_string(),
64            "Firewall error at line 3 - incorrect direction 'UNDER'"
65        );
66    }
67
68    #[test]
69    fn test_firewall_direction_to_sql() {
70        assert_eq!(
71            FirewallDirection::to_sql(&FirewallDirection::IN),
72            Ok(ToSqlOutput::Owned(Text("IN".to_string())))
73        );
74
75        assert_eq!(
76            FirewallDirection::to_sql(&FirewallDirection::OUT),
77            Ok(ToSqlOutput::Owned(Text("OUT".to_string())))
78        );
79    }
80}