ipmi_rs/
error.rs

1use crate::connection::NetFn;
2
3#[derive(Clone, Debug, PartialEq)]
4pub enum IpmiError<CON, P> {
5    NetFnIsResponse(NetFn),
6    UnexpectedResponse {
7        netfn_sent: NetFn,
8        netfn_recvd: NetFn,
9        cmd_sent: u8,
10        cmd_recvd: u8,
11    },
12    ParsingFailed {
13        error: P,
14        netfn: NetFn,
15        cmd: u8,
16        completion_code: u8,
17        data: Vec<u8>,
18    },
19    Connection(CON),
20}
21
22impl<CON, P> From<CON> for IpmiError<CON, P> {
23    fn from(value: CON) -> Self {
24        Self::Connection(value)
25    }
26}
27
28impl<CON, P> IpmiError<CON, P> {
29    pub fn map<CON2, F>(self, f: F) -> IpmiError<CON2, P>
30    where
31        F: FnOnce(CON) -> CON2,
32    {
33        match self {
34            IpmiError::NetFnIsResponse(v) => IpmiError::NetFnIsResponse(v),
35            IpmiError::UnexpectedResponse {
36                netfn_sent,
37                netfn_recvd,
38                cmd_sent,
39                cmd_recvd,
40            } => IpmiError::UnexpectedResponse {
41                netfn_sent,
42                netfn_recvd,
43                cmd_sent,
44                cmd_recvd,
45            },
46            IpmiError::ParsingFailed {
47                error,
48                netfn,
49                cmd,
50                completion_code,
51                data,
52            } => IpmiError::ParsingFailed {
53                error,
54                netfn,
55                cmd,
56                completion_code,
57                data,
58            },
59            IpmiError::Connection(e) => IpmiError::Connection(f(e)),
60        }
61    }
62}