mum_cli/
error.rs

1use mumble_protocol::{control::ControlPacket, Serverbound};
2use mumlib::error::ConfigError;
3use std::fmt;
4use tokio::sync::mpsc;
5
6pub type ServerSendError = mpsc::error::SendError<ControlPacket<Serverbound>>;
7
8#[derive(Debug)]
9pub enum TcpError {
10    NoConnectionInfoReceived,
11    TlsConnectorBuilderError(native_tls::Error),
12    TlsConnectError(native_tls::Error),
13    SendError(ServerSendError),
14
15    IOError(std::io::Error),
16}
17
18impl fmt::Display for TcpError {
19    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20        match self {
21            TcpError::NoConnectionInfoReceived => write!(f, "No connection info received"),
22            TcpError::TlsConnectorBuilderError(e) => {
23                write!(f, "Error building TLS connector: {}", e)
24            }
25            TcpError::TlsConnectError(e) => write!(f, "TLS error when connecting: {}", e),
26            TcpError::SendError(e) => write!(f, "Couldn't send packet: {}", e),
27            TcpError::IOError(e) => write!(f, "IO error: {}", e),
28        }
29    }
30}
31
32impl From<std::io::Error> for TcpError {
33    fn from(e: std::io::Error) -> Self {
34        TcpError::IOError(e)
35    }
36}
37
38impl From<ServerSendError> for TcpError {
39    fn from(e: ServerSendError) -> Self {
40        TcpError::SendError(e)
41    }
42}
43
44#[derive(Debug)]
45pub enum UdpError {
46    NoConnectionInfoReceived,
47    DisconnectBeforeCryptSetup,
48
49    IOError(std::io::Error),
50}
51
52impl From<std::io::Error> for UdpError {
53    fn from(e: std::io::Error) -> Self {
54        UdpError::IOError(e)
55    }
56}
57
58#[derive(Debug)]
59pub enum ClientError {
60    TcpError(TcpError),
61}
62
63impl fmt::Display for ClientError {
64    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65        match self {
66            ClientError::TcpError(e) => write!(f, "TCP error: {}", e),
67        }
68    }
69}
70
71#[derive(Debug)]
72pub enum AudioStream {
73    Input,
74    Output,
75}
76
77impl fmt::Display for AudioStream {
78    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79        match self {
80            AudioStream::Input => write!(f, "input"),
81            AudioStream::Output => write!(f, "output"),
82        }
83    }
84}
85
86#[derive(Debug)]
87pub enum AudioError {
88    NoDevice(AudioStream),
89    NoConfigs(AudioStream, cpal::SupportedStreamConfigsError),
90    NoSupportedConfig(AudioStream),
91    InvalidStream(AudioStream, cpal::BuildStreamError),
92    OutputPlayError(cpal::PlayStreamError),
93    OutputPauseError(cpal::PauseStreamError),
94    InputPlayError(cpal::PlayStreamError),
95    InputPauseError(cpal::PauseStreamError),
96}
97
98impl fmt::Display for AudioError {
99    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
100        match self {
101            AudioError::NoDevice(s) => write!(f, "No {} device", s),
102            AudioError::NoConfigs(s, e) => write!(f, "No {} configs: {}", s, e),
103            AudioError::NoSupportedConfig(s) => write!(f, "No supported {} config found", s),
104            AudioError::InvalidStream(s, e) => write!(f, "Invalid {} stream: {}", s, e),
105            AudioError::OutputPlayError(e) => write!(f, "Playback error: {}", e),
106            AudioError::OutputPauseError(e) => write!(f, "Playback error: {}", e),
107            AudioError::InputPlayError(e) => write!(f, "Recording error: {}", e),
108            AudioError::InputPauseError(e) => write!(f, "Recording error: {}", e),
109        }
110    }
111}
112
113#[derive(Debug)]
114pub enum StateError {
115    AudioError(AudioError),
116    ConfigError(ConfigError),
117}
118
119impl From<AudioError> for StateError {
120    fn from(e: AudioError) -> Self {
121        StateError::AudioError(e)
122    }
123}
124
125impl From<ConfigError> for StateError {
126    fn from(e: ConfigError) -> Self {
127        StateError::ConfigError(e)
128    }
129}
130
131impl fmt::Display for StateError {
132    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
133        match self {
134            StateError::AudioError(e) => write!(f, "Audio error: {}", e),
135            StateError::ConfigError(e) => write!(f, "Config error: {}", e),
136        }
137    }
138}