mpvipc_async/
error.rs

1//! Library specific error messages.
2
3use serde_json::{Map, Value};
4use thiserror::Error;
5
6use crate::{MpvDataType, Property};
7
8/// Any error that can occur when interacting with mpv.
9#[derive(Error, Debug)]
10pub enum MpvError {
11    #[error("Mpv returned error in response to command: {message}\nCommand: {command:#?}")]
12    MpvError {
13        command: Vec<Value>,
14        message: String,
15    },
16
17    #[error("Error communicating over mpv socket: {0}")]
18    MpvSocketConnectionError(String),
19
20    #[error("Internal connection error: {0}")]
21    InternalConnectionError(String),
22
23    #[error("JsonParseError: {0}")]
24    JsonParseError(#[from] serde_json::Error),
25
26    #[error("Mpv sent a value with an unexpected type:\nExpected {expected_type}, received {received:#?}")]
27    ValueContainsUnexpectedType {
28        expected_type: String,
29        received: Value,
30    },
31
32    #[error(
33        "Mpv sent data with an unexpected type:\nExpected {expected_type}, received {received:#?}"
34    )]
35    DataContainsUnexpectedType {
36        expected_type: String,
37        received: MpvDataType,
38    },
39
40    #[error("Missing expected 'data' field in mpv message")]
41    MissingMpvData,
42
43    #[error("Missing key in object:\nExpected {key} in {map:#?}")]
44    MissingKeyInObject {
45        key: String,
46        map: Map<String, Value>,
47    },
48
49    #[error("Unexpected property: {0:?}")]
50    UnexpectedProperty(Property),
51
52    #[error("Unknown error: {0}")]
53    Other(String),
54}
55
56impl PartialEq for MpvError {
57    fn eq(&self, other: &Self) -> bool {
58        match (self, other) {
59            (
60                Self::MpvError {
61                    command: l_command,
62                    message: l_message,
63                },
64                Self::MpvError {
65                    command: r_command,
66                    message: r_message,
67                },
68            ) => l_command == r_command && l_message == r_message,
69            (Self::MpvSocketConnectionError(l0), Self::MpvSocketConnectionError(r0)) => l0 == r0,
70            (Self::InternalConnectionError(l0), Self::InternalConnectionError(r0)) => l0 == r0,
71            (Self::JsonParseError(l0), Self::JsonParseError(r0)) => {
72                l0.to_string() == r0.to_string()
73            }
74            (
75                Self::ValueContainsUnexpectedType {
76                    expected_type: l_expected_type,
77                    received: l_received,
78                },
79                Self::ValueContainsUnexpectedType {
80                    expected_type: r_expected_type,
81                    received: r_received,
82                },
83            ) => l_expected_type == r_expected_type && l_received == r_received,
84            (
85                Self::DataContainsUnexpectedType {
86                    expected_type: l_expected_type,
87                    received: l_received,
88                },
89                Self::DataContainsUnexpectedType {
90                    expected_type: r_expected_type,
91                    received: r_received,
92                },
93            ) => l_expected_type == r_expected_type && l_received == r_received,
94            (
95                Self::MissingKeyInObject {
96                    key: l_key,
97                    map: l_map,
98                },
99                Self::MissingKeyInObject {
100                    key: r_key,
101                    map: r_map,
102                },
103            ) => l_key == r_key && l_map == r_map,
104
105            _ => core::mem::discriminant(self) == core::mem::discriminant(other),
106        }
107    }
108}