1use 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 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}