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}