1use std::convert::From;
2use std::fmt;
3use std::io;
4use std::iter;
5
6#[derive(Debug)]
8pub enum DecodeError {
9 IncompleteData {
11 expected_size: usize,
13 actual_size: usize,
15 },
16 InvalidHeader {
18 line: String,
20 position: usize,
22 },
23 InvalidChecksum,
25 IoError(io::Error),
27}
28
29#[derive(Debug)]
31pub enum EncodeError {
32 PartNumberMissing,
34 PartBeginOffsetMissing,
36 PartEndOffsetMissing,
38 PartOffsetsInvalidRange,
40 IoError(io::Error),
42}
43
44impl From<io::Error> for DecodeError {
45 fn from(error: io::Error) -> DecodeError {
46 DecodeError::IoError(error)
47 }
48}
49
50impl From<io::Error> for EncodeError {
51 fn from(error: io::Error) -> EncodeError {
52 EncodeError::IoError(error)
53 }
54}
55
56impl fmt::Display for DecodeError {
57 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58 match *self {
59 DecodeError::IncompleteData {
60 ref expected_size,
61 ref actual_size,
62 } => write!(
63 f,
64 "Incomplete data: expected size {}, actual size {}",
65 expected_size, actual_size
66 ),
67 DecodeError::InvalidHeader { ref line, position } => write!(
68 f,
69 "Invalid header: \n{}\n{}^",
70 line,
71 iter::repeat(" ").take(position).collect::<String>()
72 ),
73 DecodeError::InvalidChecksum => write!(f, "Invalid checksum"),
74 DecodeError::IoError(ref err) => write!(f, "I/O error {}", err),
75 }
76 }
77}
78
79impl fmt::Display for EncodeError {
80 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
81 match *self {
82 EncodeError::PartNumberMissing => {
83 write!(f, "Multiple parts, but no part number specified.")
84 }
85 EncodeError::PartBeginOffsetMissing => {
86 write!(f, "Multiple parts, but no begin offset specified.")
87 }
88 EncodeError::PartEndOffsetMissing => {
89 write!(f, "Multiple parts, but no end offset specified.")
90 }
91 EncodeError::PartOffsetsInvalidRange => {
92 write!(f, "Multiple parts, begin offset larger than end offset")
93 }
94 EncodeError::IoError(ref err) => write!(f, "I/O error {}", err),
95 }
96 }
97}
98