1
use std::fmt::Display;
2

            
3
use serde::{Deserialize, Serialize};
4
use thiserror::Error;
5

            
6
pub type Response = Result<(), MpdError>;
7

            
8
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9
pub enum ErrorCode {
10
    // NOTE: seemingly unused
11
    NotList = 1,
12
    Arg = 2,
13
    // NOTE: only used for 'password' command
14
    Password = 3,
15
    Permission = 4,
16
    // NOTE: Catchall error
17
    Unknown = 5,
18

            
19
    NoExist = 50,
20
    PlaylistMax = 51,
21
    System = 52,
22
    PlaylistLoad = 53,
23
    UpdateAlready = 54,
24
    PlayerSync = 55,
25
    Exist = 56,
26
}
27

            
28
#[derive(Error, Debug, Clone, PartialEq, Serialize, Deserialize)]
29
pub struct MpdError {
30
    code: ErrorCode,
31
    command: String,
32
    message: String,
33
    command_list_num: usize,
34
}
35

            
36
impl Display for MpdError {
37
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
38
        write!(
39
            f,
40
            "MPD Error (code: {:?}, command: '{}', message: '{}', command_list_num: {})",
41
            self.code, self.command, self.message, self.command_list_num
42
        )
43
    }
44
}