homelander/
execute_error.rs

1use crate::traits::arm_disarm::ArmDisarmError;
2use crate::traits::cook::CookError;
3use crate::traits::dispense::DispenseError;
4use crate::traits::energy_storage::EnergyStorageError;
5use crate::traits::fan_speed::FanSpeedError;
6use crate::traits::input_selector::InputSelectorError;
7use crate::traits::lock_unlock::LockUnlockError;
8use crate::traits::network_control::NetworkControlError;
9use crate::traits::open_close::OpenCloseError;
10use crate::{CombinedDeviceError, ToStringError};
11use std::error::Error;
12
13#[derive(Debug)]
14pub enum ExecuteError {
15    Serializable(Box<dyn ToStringError>),
16    Server(Box<dyn Error>),
17}
18
19macro_rules! impl_execute_error {
20    ($ty:ty) => {
21        impl From<$ty> for ExecuteError {
22            fn from(t: $ty) -> Self {
23                Self::Serializable(Box::new(t))
24            }
25        }
26    };
27}
28
29impl From<CombinedDeviceError> for ExecuteError {
30    fn from(x: CombinedDeviceError) -> Self {
31        match x {
32            CombinedDeviceError::Other(x) => Self::Server(Box::new(x)),
33            CombinedDeviceError::DeviceError(e) => Self::Serializable(Box::new(e)),
34            CombinedDeviceError::DeviceException(e) => Self::Serializable(Box::new(e)),
35        }
36    }
37}
38
39impl_execute_error!(ArmDisarmError);
40impl_execute_error!(CookError);
41impl_execute_error!(DispenseError);
42impl_execute_error!(EnergyStorageError);
43impl_execute_error!(FanSpeedError);
44impl_execute_error!(InputSelectorError);
45impl_execute_error!(LockUnlockError);
46impl_execute_error!(NetworkControlError);
47impl_execute_error!(OpenCloseError);