1use crate::connection::{CompletionErrorCode, 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 Failed {
13 netfn: NetFn,
14 cmd: u8,
15 completion_code: CompletionErrorCode,
16 data: Vec<u8>,
17 },
18 Command {
19 error: P,
20 netfn: NetFn,
21 cmd: u8,
22 completion_code: Option<CompletionErrorCode>,
23 data: Vec<u8>,
24 },
25 Connection(CON),
26}
27
28impl<CON, P> From<CON> for IpmiError<CON, P> {
29 fn from(value: CON) -> Self {
30 Self::Connection(value)
31 }
32}
33
34impl<CON, P> IpmiError<CON, P> {
35 pub fn map<CON2, F>(self, f: F) -> IpmiError<CON2, P>
36 where
37 F: FnOnce(CON) -> CON2,
38 {
39 match self {
40 IpmiError::NetFnIsResponse(v) => IpmiError::NetFnIsResponse(v),
41 IpmiError::UnexpectedResponse {
42 netfn_sent,
43 netfn_recvd,
44 cmd_sent,
45 cmd_recvd,
46 } => IpmiError::UnexpectedResponse {
47 netfn_sent,
48 netfn_recvd,
49 cmd_sent,
50 cmd_recvd,
51 },
52 IpmiError::Command {
53 error,
54 netfn,
55 cmd,
56 completion_code,
57 data,
58 } => IpmiError::Command {
59 error,
60 netfn,
61 cmd,
62 completion_code,
63 data,
64 },
65 IpmiError::Failed {
66 netfn,
67 cmd,
68 completion_code,
69 data,
70 } => IpmiError::Failed {
71 netfn,
72 cmd,
73 completion_code,
74 data,
75 },
76 IpmiError::Connection(e) => IpmiError::Connection(f(e)),
77 }
78 }
79}