Skip to main content

nl_wireguard/
error.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_core::NetlinkMessage;
4use netlink_packet_generic::GenlMessage;
5
6use crate::WireguardMessage;
7
8#[derive(Clone, Copy, Eq, PartialEq, Debug)]
9pub enum ErrorKind {
10    Bug,
11    NetlinkError,
12    DecodeError,
13    /// Invalid key, should be base64 encoded of [u8; 32]
14    InvalidKey,
15}
16
17impl std::fmt::Display for ErrorKind {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        write!(
20            f,
21            "{}",
22            match self {
23                Self::Bug => "bug",
24                Self::NetlinkError => "netlink_error",
25                Self::DecodeError => "decode_error",
26                Self::InvalidKey => "invalid_key",
27            }
28        )
29    }
30}
31
32#[derive(Clone, Eq, PartialEq, Debug)]
33pub struct WireguardError {
34    pub kind: ErrorKind,
35    pub msg: String,
36    pub netlink_msg: Option<NetlinkMessage<GenlMessage<WireguardMessage>>>,
37}
38
39impl std::fmt::Display for WireguardError {
40    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41        if let Some(nl_msg) = self.netlink_msg.as_ref() {
42            write!(
43                f,
44                "{}: {}, netlink message: {:?}",
45                self.kind, self.msg, nl_msg
46            )
47        } else {
48            write!(f, "{}: {}", self.kind, self.msg)
49        }
50    }
51}
52
53impl std::error::Error for WireguardError {}
54
55impl WireguardError {
56    pub fn new(
57        kind: ErrorKind,
58        msg: String,
59        netlink_msg: Option<NetlinkMessage<GenlMessage<WireguardMessage>>>,
60    ) -> Self {
61        Self {
62            kind,
63            msg,
64            netlink_msg,
65        }
66    }
67}