]> code.octet-stream.net Git - m17rt/blob - m17app/src/error.rs
Error handler for soundmodem components
[m17rt] / m17app / src / error.rs
1 use std::{fmt::Display, path::PathBuf};
2
3 use thiserror::Error;
4
5 /// Errors from the M17 Rust Toolkit
6 #[derive(Debug, Error)]
7 pub enum M17Error {
8 #[error("given callsign contains at least one character invalid in M17: {0}")]
9 InvalidCallsignCharacters(char),
10
11 #[error("given callsign is {0} characters long; maximum is 9")]
12 CallsignTooLong(usize),
13
14 #[error(
15 "provided packet payload is too large: provided {provided} bytes, capacity {capacity}"
16 )]
17 PacketTooLarge { provided: usize, capacity: usize },
18
19 #[error("provided path to RRC file could not be opened: {0}")]
20 InvalidRrcPath(PathBuf),
21
22 #[error("failed to read from RRC file: {0}")]
23 RrcReadFailed(PathBuf),
24
25 #[error("tried to start app more than once")]
26 InvalidStart,
27
28 #[error("tried to close app that is not started")]
29 InvalidClose,
30
31 #[error("adapter error for id {0}: {1}")]
32 Adapter(usize, #[source] AdapterError),
33
34 #[error("soundmodem component error: {0}")]
35 Soundmodem(#[source] SoundmodemError),
36 }
37
38 /// Arbitrary error type returned from adapters, which may be user-implemented
39 pub type AdapterError = Box<dyn std::error::Error + Sync + Send + 'static>;
40
41 /// Arbitrary error type returned from soundmodem components, which may be user-implemented
42 pub type SoundmodemError = Box<dyn std::error::Error + Sync + Send + 'static>;
43
44 /// Iterator over potentially multiple errors
45 #[derive(Debug, Error)]
46 pub struct M17Errors(pub(crate) Vec<M17Error>);
47 impl Iterator for M17Errors {
48 type Item = M17Error;
49
50 fn next(&mut self) -> Option<Self::Item> {
51 self.0.pop()
52 }
53 }
54
55 impl Display for M17Errors {
56 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57 let mut displays = vec![];
58 for e in &self.0 {
59 displays.push(e.to_string());
60 }
61 write!(f, "[{}]", displays.join(", "))
62 }
63 }
64
65 #[derive(Debug, Error)]
66 pub enum M17SoundmodemError {}