nullnet_firewall/
firewall_error.rs

1use std::fmt::{Display, Formatter};
2
3use crate::firewall_option::FirewallOption;
4
5/// Error that may arise as a consequence of an invalid firewall specification.
6#[derive(Debug, Eq, PartialEq, Clone)]
7pub enum FirewallError {
8    /// The value supplied for the option `--dport` is invalid.
9    InvalidDportValue(usize, String),
10    /// The value supplied for the option `--sport` is invalid.
11    InvalidSportValue(usize, String),
12    /// The value supplied for the option `--dest` is invalid.
13    InvalidDestValue(usize, String),
14    /// The value supplied for the option `--source` is invalid.
15    InvalidSourceValue(usize, String),
16    /// The value supplied for the option `--icmp-type` is invalid.
17    InvalidIcmpTypeValue(usize, String),
18    /// The value supplied for the option `--proto` is invalid.
19    InvalidProtocolValue(usize, String),
20    /// An invalid direction has been specified for a firewall rule.
21    InvalidDirection(usize, String),
22    /// An invalid action has been specified for a firewall rule.
23    InvalidAction(usize, String),
24    /// An unknown option has been specified for a firewall rule.
25    UnknownOption(usize, String),
26    /// An empty option has been specified for a firewall rule.
27    EmptyOption(usize, String),
28    /// The same option has been specified multiple times for the same firewall rule.
29    DuplicatedOption(usize, String),
30    /// Not enough arguments have been specified for a firewall rule.
31    NotEnoughArguments(usize),
32    /// The option `--icmp-type` is valid only if `--proto 1` or `--proto 58` is also specified.
33    NotApplicableIcmpType(usize),
34}
35
36impl Display for FirewallError {
37    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
38        let (l, err_info) = match self {
39            FirewallError::InvalidDportValue(l, val) => (
40                l,
41                format!(
42                    "incorrect value for option '{} {val}'",
43                    FirewallOption::DPORT
44                ),
45            ),
46            FirewallError::InvalidSportValue(l, val) => (
47                l,
48                format!(
49                    "incorrect value for option '{} {val}'",
50                    FirewallOption::SPORT
51                ),
52            ),
53            FirewallError::InvalidDestValue(l, val) => (
54                l,
55                format!(
56                    "incorrect value for option '{} {val}'",
57                    FirewallOption::DEST
58                ),
59            ),
60            FirewallError::InvalidSourceValue(l, val) => (
61                l,
62                format!(
63                    "incorrect value for option '{} {val}'",
64                    FirewallOption::SOURCE
65                ),
66            ),
67            FirewallError::InvalidIcmpTypeValue(l, val) => (
68                l,
69                format!(
70                    "incorrect value for option '{} {val}'",
71                    FirewallOption::ICMPTYPE
72                ),
73            ),
74            FirewallError::InvalidProtocolValue(l, val) => (
75                l,
76                format!(
77                    "incorrect value for option '{} {val}'",
78                    FirewallOption::PROTO
79                ),
80            ),
81            FirewallError::InvalidDirection(l, direction) => {
82                (l, format!("incorrect direction '{direction}'"))
83            }
84            FirewallError::InvalidAction(l, action) => (l, format!("incorrect action '{action}'")),
85            FirewallError::UnknownOption(l, opt) => {
86                (l, format!("the specified option '{opt}' doesn't exist"))
87            }
88            FirewallError::NotEnoughArguments(l) => {
89                (l, "not enough arguments supplied for rule".to_string())
90            }
91            FirewallError::EmptyOption(l, opt) => {
92                (l, format!("the supplied option '{opt}' is empty"))
93            }
94            FirewallError::DuplicatedOption(l, opt) => {
95                (l, format!("duplicated option '{opt}' for the same rule"))
96            }
97            FirewallError::NotApplicableIcmpType(l) => (
98                l,
99                format!(
100                    "option '{}' is valid only if '{} 1' or '{} 58' is also specified",
101                    FirewallOption::ICMPTYPE,
102                    FirewallOption::PROTO,
103                    FirewallOption::PROTO
104                ),
105            ),
106        };
107
108        write!(f, "Firewall error at line {l} - {err_info}")
109    }
110}