Skip to main content

melodium_distribution/
error.rs

1use melodium_common::descriptor::{LoadingError, Status};
2use melodium_share::SharingError;
3use std::error::Error;
4use std::fmt::{Display, Formatter};
5
6#[derive(Debug, Clone)]
7pub struct DistributionError {
8    pub id: u32,
9    pub kind: DistributionErrorKind,
10}
11
12#[derive(Debug, Clone)]
13pub enum DistributionErrorKind {
14    Loading { error: LoadingError },
15    Sharing { error: SharingError },
16}
17
18impl Display for DistributionErrorKind {
19    fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
20        match self {
21            DistributionErrorKind::Loading { error } => write!(f, "{}", error),
22            DistributionErrorKind::Sharing { error } => write!(f, "{}", error),
23        }
24    }
25}
26
27impl DistributionError {
28    pub fn loading(id: u32, error: LoadingError) -> Self {
29        Self {
30            id,
31            kind: DistributionErrorKind::Loading { error },
32        }
33    }
34
35    pub fn sharing(id: u32, error: SharingError) -> Self {
36        Self {
37            id,
38            kind: DistributionErrorKind::Sharing { error },
39        }
40    }
41}
42
43impl Display for DistributionError {
44    fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
45        write!(f, "T{:04}: {}", self.id, self.kind)
46    }
47}
48
49impl From<LoadingError> for DistributionError {
50    fn from(le: LoadingError) -> Self {
51        DistributionError::loading(0, le)
52    }
53}
54
55impl From<SharingError> for DistributionError {
56    fn from(se: SharingError) -> Self {
57        DistributionError::sharing(0, se)
58    }
59}
60
61impl Error for DistributionError {
62    fn source(&self) -> Option<&(dyn Error + 'static)> {
63        // Generic error, underlying cause isn't tracked.
64        None
65    }
66}
67
68pub type DistributionErrors = Vec<DistributionError>;
69pub type DistributionResult<T> = Status<T, DistributionError, DistributionError>;
70
71impl From<DistributionError> for DistributionErrors {
72    fn from(value: DistributionError) -> Self {
73        vec![value]
74    }
75}