1use core::fmt;
6
7use crate::SV2_FRAME_HEADER_SIZE;
8
9#[derive(Debug, PartialEq, Eq)]
10pub enum Error {
11 BinarySv2Error(binary_sv2::Error),
13
14 UnexpectedDestinationLength {
17 expected: usize,
19 actual: usize,
21 },
22
23 PayloadLengthMismatch {
26 declared: usize,
28 written: usize,
30 },
31
32 UnexpectedHeaderLength(usize),
34
35 PayloadTooLong(usize),
38}
39
40impl fmt::Display for Error {
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 use Error::*;
43 match self {
44 BinarySv2Error(ref e) => {
45 write!(f, "BinarySv2Error: `{e}`")
46 }
47 UnexpectedDestinationLength { expected, actual } => {
48 write!(
49 f,
50 "Destination buffer is `{actual}` bytes long, the encoded frame takes `{expected}`"
51 )
52 }
53 PayloadLengthMismatch { declared, written } => {
54 write!(
55 f,
56 "Message serialized to `{written}` bytes, its `Header` declares `{declared}`"
57 )
58 }
59 UnexpectedHeaderLength(actual_size) => {
60 write!(
61 f,
62 "Unexpected `Header` length: `{actual_size}`, should be equal or more to {SV2_FRAME_HEADER_SIZE}"
63 )
64 }
65 PayloadTooLong(len) => {
66 write!(
67 f,
68 "Payload of `{len}` bytes does not fit the 24-bit `msg_length` of a `Header`"
69 )
70 }
71 }
72 }
73}
74
75impl From<binary_sv2::Error> for Error {
76 fn from(e: binary_sv2::Error) -> Self {
77 Error::BinarySv2Error(e)
78 }
79}
80
81#[cfg(test)]
82mod tests {
83 use super::Error;
84 use alloc::{string::ToString, vec};
85
86 #[test]
89 fn binary_error_display_does_not_dump_embedded_payload() {
90 let sample = vec![0xAB_u8; 64 * 1024];
91 let err = Error::BinarySv2Error(binary_sv2::Error::ValueExceedsMaxSize(
92 false,
93 1,
94 1,
95 32,
96 sample,
97 64 * 1024,
98 ));
99
100 let rendered = err.to_string();
101
102 assert!(
103 !rendered.contains("171"),
104 "Display leaked sample bytes: {rendered}"
105 );
106 assert!(
107 rendered.len() < 128,
108 "Display grew with the sample: {} bytes",
109 rendered.len()
110 );
111 }
112}