1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use std::fmt;

#[derive(Debug, PartialEq)]
pub enum MessageErrorDetails {
    NoData,
    NoPrefix,
    NoClient,
    FailedPrefixParse,
    FailedCommandParse,
    FailedParamParse,
    NoCommand,
    InvalidCommand,
    NotEnoughParams,
    FailedBuild,
    FailedSerialize,
}

impl MessageErrorDetails {
    pub fn error_text(&self) -> &str {
        match *self {
            MessageErrorDetails::NoData => "No data in message",
            MessageErrorDetails::NoClient => "No client identifier",
            MessageErrorDetails::NoPrefix => "Missing : character",
            MessageErrorDetails::FailedPrefixParse => "Failed to parse prefix data",
            MessageErrorDetails::InvalidCommand => "Invalid command",
            MessageErrorDetails::NoCommand => "No command provided",
            MessageErrorDetails::FailedCommandParse => "Failed to parse command data",
            MessageErrorDetails::FailedParamParse => "Failed to parse param data",
            MessageErrorDetails::NotEnoughParams => "Not enough params for command",
            MessageErrorDetails::FailedBuild => "Failed to build Message, unknown error",
            MessageErrorDetails::FailedSerialize => "Failed to serialize message, unknown error",
        }
    }
}

#[derive(Debug, PartialEq)]
pub struct MessageError {
    pub detail: MessageErrorDetails,
}

impl fmt::Display for MessageError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "MessageError {}", self.detail.error_text())
    }
}