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}