LuaDevice macro now uses LuaDeviceCreate trait to create devices from configs

This commit is contained in:
Dreaded_X 2024-04-29 02:53:21 +02:00
parent c91de03333
commit 42eb4b3fa5
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
16 changed files with 116 additions and 84 deletions

View File

@ -1,30 +1,9 @@
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use syn::{Data, DataStruct, DeriveInput, Fields, FieldsNamed}; use syn::DeriveInput;
pub fn impl_lua_device_macro(ast: &DeriveInput) -> TokenStream { pub fn impl_lua_device_macro(ast: &DeriveInput) -> TokenStream {
let name = &ast.ident; let name = &ast.ident;
// TODO: Handle errors properly
// This includes making sure one, and only one config is specified
let config = if let Data::Struct(DataStruct {
fields: Fields::Named(FieldsNamed { ref named, .. }),
..
}) = ast.data
{
named
.iter()
.find(|&field| {
field
.attrs
.iter()
.any(|attr| attr.path().is_ident("config"))
})
.map(|field| field.ty.clone())
.unwrap()
} else {
unimplemented!()
};
let gen = quote! { let gen = quote! {
impl #name { impl #name {
pub fn register_with_lua(lua: &mlua::Lua) -> mlua::Result<()> { pub fn register_with_lua(lua: &mlua::Lua) -> mlua::Result<()> {
@ -34,8 +13,10 @@ pub fn impl_lua_device_macro(ast: &DeriveInput) -> TokenStream {
impl mlua::UserData for #name { impl mlua::UserData for #name {
fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_async_function("new", |lua, config: mlua::Value| async { methods.add_async_function("new", |lua, config: mlua::Value| async {
let config: #config = mlua::FromLua::from_lua(config, lua)?; let config = mlua::FromLua::from_lua(config, lua)?;
let device = #name::create(config).await.map_err(mlua::ExternalError::into_lua_err)?;
// TODO: Using crate:: could cause issues
let device: #name = crate::devices::LuaDeviceCreate::create(config).await.map_err(mlua::ExternalError::into_lua_err)?;
Ok(crate::device_manager::WrappedDevice::new(Box::new(device))) Ok(crate::device_manager::WrappedDevice::new(Box::new(device)))
}); });

View File

@ -8,9 +8,9 @@ use google_home::GoogleHomeDevice;
use rumqttc::Publish; use rumqttc::Publish;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use super::LuaDeviceCreate;
use crate::config::{InfoConfig, MqttDeviceConfig}; use crate::config::{InfoConfig, MqttDeviceConfig};
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError;
use crate::event::OnMqtt; use crate::event::OnMqtt;
use crate::messages::{AirFilterFanState, AirFilterState, SetAirFilterFanState}; use crate::messages::{AirFilterFanState, AirFilterState, SetAirFilterFanState};
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -27,7 +27,6 @@ pub struct AirFilterConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct AirFilter { pub struct AirFilter {
#[config]
config: AirFilterConfig, config: AirFilterConfig,
last_known_state: AirFilterState, last_known_state: AirFilterState,
@ -53,8 +52,12 @@ impl AirFilter {
} }
} }
impl AirFilter { #[async_trait]
async fn create(config: AirFilterConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for AirFilter {
type Config = AirFilterConfig;
type Error = rumqttc::ClientError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.info.identifier(), "Setting up AirFilter"); trace!(id = config.info.identifier(), "Setting up AirFilter");
config config

View File

@ -3,7 +3,7 @@ use automation_macro::{LuaDevice, LuaDeviceConfig};
use google_home::traits::OnOff; use google_home::traits::OnOff;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use super::Device; use super::{Device, LuaDeviceCreate};
use crate::config::MqttDeviceConfig; use crate::config::MqttDeviceConfig;
use crate::device_manager::WrappedDevice; use crate::device_manager::WrappedDevice;
use crate::devices::As; use crate::devices::As;
@ -27,12 +27,15 @@ pub struct AudioSetupConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct AudioSetup { pub struct AudioSetup {
#[config]
config: AudioSetupConfig, config: AudioSetupConfig,
} }
impl AudioSetup { #[async_trait]
async fn create(config: AudioSetupConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for AudioSetup {
type Config = AudioSetupConfig;
type Error = DeviceConfigError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.identifier, "Setting up AudioSetup"); trace!(id = config.identifier, "Setting up AudioSetup");
let mixer_id = config.mixer.read().await.get_id().to_owned(); let mixer_id = config.mixer.read().await.get_id().to_owned();

View File

@ -7,7 +7,7 @@ use mlua::FromLua;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use super::Device; use super::{Device, LuaDeviceCreate};
use crate::config::MqttDeviceConfig; use crate::config::MqttDeviceConfig;
use crate::device_manager::WrappedDevice; use crate::device_manager::WrappedDevice;
use crate::devices::{As, DEFAULT_PRESENCE}; use crate::devices::{As, DEFAULT_PRESENCE};
@ -64,7 +64,6 @@ pub struct ContactSensorConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct ContactSensor { pub struct ContactSensor {
#[config]
config: ContactSensorConfig, config: ContactSensorConfig,
overall_presence: bool, overall_presence: bool,
@ -72,8 +71,12 @@ pub struct ContactSensor {
handle: Option<JoinHandle<()>>, handle: Option<JoinHandle<()>>,
} }
impl ContactSensor { #[async_trait]
async fn create(config: ContactSensorConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for ContactSensor {
type Config = ContactSensorConfig;
type Error = DeviceConfigError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.identifier, "Setting up ContactSensor"); trace!(id = config.identifier, "Setting up ContactSensor");
// Make sure the devices implement the required traits // Make sure the devices implement the required traits

View File

@ -1,10 +1,12 @@
use std::convert::Infallible;
use async_trait::async_trait; use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig}; use automation_macro::{LuaDevice, LuaDeviceConfig};
use tracing::{trace, warn}; use tracing::{trace, warn};
use super::LuaDeviceCreate;
use crate::config::MqttDeviceConfig; use crate::config::MqttDeviceConfig;
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError;
use crate::event::{OnDarkness, OnPresence}; use crate::event::{OnDarkness, OnPresence};
use crate::messages::{DarknessMessage, PresenceMessage}; use crate::messages::{DarknessMessage, PresenceMessage};
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -20,12 +22,15 @@ pub struct DebugBridgeConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct DebugBridge { pub struct DebugBridge {
#[config]
config: DebugBridgeConfig, config: DebugBridgeConfig,
} }
impl DebugBridge { #[async_trait]
async fn create(config: DebugBridgeConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for DebugBridge {
type Config = DebugBridgeConfig;
type Error = Infallible;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.identifier, "Setting up DebugBridge"); trace!(id = config.identifier, "Setting up DebugBridge");
Ok(Self { config }) Ok(Self { config })
} }

View File

@ -1,3 +1,4 @@
use std::convert::Infallible;
use std::net::SocketAddr; use std::net::SocketAddr;
use async_trait::async_trait; use async_trait::async_trait;
@ -5,8 +6,8 @@ use automation_macro::{LuaDevice, LuaDeviceConfig};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tracing::{error, trace, warn}; use tracing::{error, trace, warn};
use super::LuaDeviceCreate;
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError;
use crate::event::{OnDarkness, OnPresence}; use crate::event::{OnDarkness, OnPresence};
#[derive(Debug)] #[derive(Debug)]
@ -32,7 +33,6 @@ pub struct HueBridgeConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct HueBridge { pub struct HueBridge {
#[config]
config: HueBridgeConfig, config: HueBridgeConfig,
} }
@ -41,12 +41,18 @@ struct FlagMessage {
flag: bool, flag: bool,
} }
impl HueBridge { #[async_trait]
async fn create(config: HueBridgeConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for HueBridge {
type Config = HueBridgeConfig;
type Error = Infallible;
async fn create(config: Self::Config) -> Result<Self, Infallible> {
trace!(id = config.identifier, "Setting up HueBridge"); trace!(id = config.identifier, "Setting up HueBridge");
Ok(Self { config }) Ok(Self { config })
} }
}
impl HueBridge {
pub async fn set_flag(&self, flag: Flag, value: bool) { pub async fn set_flag(&self, flag: Flag, value: bool) {
let flag_id = match flag { let flag_id = match flag {
Flag::Presence => self.config.flags.presence, Flag::Presence => self.config.flags.presence,

View File

@ -9,9 +9,8 @@ use google_home::traits::OnOff;
use rumqttc::{Publish, SubscribeFilter}; use rumqttc::{Publish, SubscribeFilter};
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use super::Device; use super::{Device, LuaDeviceCreate};
use crate::config::MqttDeviceConfig; use crate::config::MqttDeviceConfig;
use crate::error::DeviceConfigError;
use crate::event::OnMqtt; use crate::event::OnMqtt;
use crate::messages::{RemoteAction, RemoteMessage}; use crate::messages::{RemoteAction, RemoteMessage};
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -34,13 +33,16 @@ pub struct HueGroupConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct HueGroup { pub struct HueGroup {
#[config]
config: HueGroupConfig, config: HueGroupConfig,
} }
// Couple of helper function to get the correct urls // Couple of helper function to get the correct urls
impl HueGroup { #[async_trait]
async fn create(config: HueGroupConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for HueGroup {
type Config = HueGroupConfig;
type Error = rumqttc::ClientError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.identifier, "Setting up AudioSetup"); trace!(id = config.identifier, "Setting up AudioSetup");
if !config.remotes.is_empty() { if !config.remotes.is_empty() {
@ -55,7 +57,9 @@ impl HueGroup {
Ok(Self { config }) Ok(Self { config })
} }
}
impl HueGroup {
fn url_base(&self) -> String { fn url_base(&self) -> String {
format!("http://{}/api/{}", self.config.addr, self.config.login) format!("http://{}/api/{}", self.config.addr, self.config.login)
} }

View File

@ -12,9 +12,9 @@ use serde::Deserialize;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use super::LuaDeviceCreate;
use crate::config::{InfoConfig, MqttDeviceConfig}; use crate::config::{InfoConfig, MqttDeviceConfig};
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError;
use crate::event::{OnMqtt, OnPresence}; use crate::event::{OnMqtt, OnPresence};
use crate::messages::{OnOffMessage, RemoteAction, RemoteMessage}; use crate::messages::{OnOffMessage, RemoteAction, RemoteMessage};
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -47,7 +47,6 @@ pub struct IkeaOutletConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct IkeaOutlet { pub struct IkeaOutlet {
#[config]
config: IkeaOutletConfig, config: IkeaOutletConfig,
last_known_state: bool, last_known_state: bool,
@ -71,8 +70,12 @@ async fn set_on(client: WrappedAsyncClient, topic: &str, on: bool) {
.ok(); .ok();
} }
impl IkeaOutlet { #[async_trait]
async fn create(config: IkeaOutletConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for IkeaOutlet {
type Config = IkeaOutletConfig;
type Error = rumqttc::ClientError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.info.identifier(), "Setting up IkeaOutlet"); trace!(id = config.info.identifier(), "Setting up IkeaOutlet");
if !config.remotes.is_empty() { if !config.remotes.is_empty() {

View File

@ -1,3 +1,4 @@
use std::convert::Infallible;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::str::Utf8Error; use std::str::Utf8Error;
@ -12,8 +13,7 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tracing::trace; use tracing::trace;
use super::Device; use super::{Device, LuaDeviceCreate};
use crate::error::DeviceConfigError;
#[derive(Debug, Clone, LuaDeviceConfig)] #[derive(Debug, Clone, LuaDeviceConfig)]
pub struct KasaOutletConfig { pub struct KasaOutletConfig {
@ -24,12 +24,15 @@ pub struct KasaOutletConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct KasaOutlet { pub struct KasaOutlet {
#[config]
config: KasaOutletConfig, config: KasaOutletConfig,
} }
impl KasaOutlet { #[async_trait]
async fn create(config: KasaOutletConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for KasaOutlet {
type Config = KasaOutletConfig;
type Error = Infallible;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.identifier, "Setting up KasaOutlet"); trace!(id = config.identifier, "Setting up KasaOutlet");
Ok(Self { config }) Ok(Self { config })
} }

View File

@ -3,9 +3,9 @@ use automation_macro::{LuaDevice, LuaDeviceConfig};
use rumqttc::Publish; use rumqttc::Publish;
use tracing::{debug, trace, warn}; use tracing::{debug, trace, warn};
use super::LuaDeviceCreate;
use crate::config::MqttDeviceConfig; use crate::config::MqttDeviceConfig;
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError;
use crate::event::{self, Event, EventChannel, OnMqtt}; use crate::event::{self, Event, EventChannel, OnMqtt};
use crate::messages::BrightnessMessage; use crate::messages::BrightnessMessage;
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -27,14 +27,17 @@ pub const DEFAULT: bool = false;
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct LightSensor { pub struct LightSensor {
#[config]
config: LightSensorConfig, config: LightSensorConfig,
is_dark: bool, is_dark: bool,
} }
impl LightSensor { #[async_trait]
async fn create(config: LightSensorConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for LightSensor {
type Config = LightSensorConfig;
type Error = rumqttc::ClientError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.identifier, "Setting up LightSensor"); trace!(id = config.identifier, "Setting up LightSensor");
config config

View File

@ -12,6 +12,7 @@ mod presence;
mod wake_on_lan; mod wake_on_lan;
mod washer; mod washer;
use async_trait::async_trait;
use google_home::device::AsGoogleHomeDevice; use google_home::device::AsGoogleHomeDevice;
use google_home::traits::OnOff; use google_home::traits::OnOff;
@ -31,6 +32,16 @@ pub use self::washer::*;
use crate::event::{OnDarkness, OnMqtt, OnNotification, OnPresence}; use crate::event::{OnDarkness, OnMqtt, OnNotification, OnPresence};
use crate::traits::Timeout; use crate::traits::Timeout;
#[async_trait]
pub trait LuaDeviceCreate {
type Config;
type Error;
async fn create(config: Self::Config) -> Result<Self, Self::Error>
where
Self: Sized;
}
#[impl_cast::device(As: OnMqtt + OnPresence + OnDarkness + OnNotification + OnOff + Timeout)] #[impl_cast::device(As: OnMqtt + OnPresence + OnDarkness + OnNotification + OnOff + Timeout)]
pub trait Device: AsGoogleHomeDevice + std::fmt::Debug + Sync + Send { pub trait Device: AsGoogleHomeDevice + std::fmt::Debug + Sync + Send {
fn get_id(&self) -> String; fn get_id(&self) -> String;

View File

@ -1,4 +1,5 @@
use std::collections::HashMap; use std::collections::HashMap;
use std::convert::Infallible;
use async_trait::async_trait; use async_trait::async_trait;
use automation_macro::{LuaDevice, LuaDeviceConfig}; use automation_macro::{LuaDevice, LuaDeviceConfig};
@ -6,8 +7,8 @@ use serde::Serialize;
use serde_repr::*; use serde_repr::*;
use tracing::{error, trace, warn}; use tracing::{error, trace, warn};
use super::LuaDeviceCreate;
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError;
use crate::event::{self, Event, EventChannel, OnNotification, OnPresence}; use crate::event::{self, Event, EventChannel, OnNotification, OnPresence};
#[derive(Debug, Serialize_repr, Clone, Copy)] #[derive(Debug, Serialize_repr, Clone, Copy)]
@ -121,12 +122,15 @@ pub struct NtfyConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct Ntfy { pub struct Ntfy {
#[config]
config: NtfyConfig, config: NtfyConfig,
} }
impl Ntfy { #[async_trait]
async fn create(config: NtfyConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for Ntfy {
type Config = NtfyConfig;
type Error = Infallible;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = "ntfy", "Setting up Ntfy"); trace!(id = "ntfy", "Setting up Ntfy");
Ok(Self { config }) Ok(Self { config })
} }

View File

@ -5,9 +5,9 @@ use automation_macro::{LuaDevice, LuaDeviceConfig};
use rumqttc::Publish; use rumqttc::Publish;
use tracing::{debug, trace, warn}; use tracing::{debug, trace, warn};
use super::LuaDeviceCreate;
use crate::config::MqttDeviceConfig; use crate::config::MqttDeviceConfig;
use crate::devices::Device; use crate::devices::Device;
use crate::error::DeviceConfigError;
use crate::event::{self, Event, EventChannel, OnMqtt}; use crate::event::{self, Event, EventChannel, OnMqtt};
use crate::messages::PresenceMessage; use crate::messages::PresenceMessage;
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -26,14 +26,17 @@ pub const DEFAULT_PRESENCE: bool = false;
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct Presence { pub struct Presence {
#[config]
config: PresenceConfig, config: PresenceConfig,
devices: HashMap<String, bool>, devices: HashMap<String, bool>,
current_overall_presence: bool, current_overall_presence: bool,
} }
impl Presence { #[async_trait]
async fn create(config: PresenceConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for Presence {
type Config = PresenceConfig;
type Error = rumqttc::ClientError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = "ntfy", "Setting up Presence"); trace!(id = "ntfy", "Setting up Presence");
config config

View File

@ -10,9 +10,8 @@ use google_home::{device, GoogleHomeDevice};
use rumqttc::Publish; use rumqttc::Publish;
use tracing::{debug, error, trace}; use tracing::{debug, error, trace};
use super::Device; use super::{Device, LuaDeviceCreate};
use crate::config::{InfoConfig, MqttDeviceConfig}; use crate::config::{InfoConfig, MqttDeviceConfig};
use crate::error::DeviceConfigError;
use crate::event::OnMqtt; use crate::event::OnMqtt;
use crate::messages::ActivateMessage; use crate::messages::ActivateMessage;
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -32,12 +31,15 @@ pub struct WakeOnLANConfig {
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct WakeOnLAN { pub struct WakeOnLAN {
#[config]
config: WakeOnLANConfig, config: WakeOnLANConfig,
} }
impl WakeOnLAN { #[async_trait]
async fn create(config: WakeOnLANConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for WakeOnLAN {
type Config = WakeOnLANConfig;
type Error = rumqttc::ClientError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.info.identifier(), "Setting up WakeOnLAN"); trace!(id = config.info.identifier(), "Setting up WakeOnLAN");
config config

View File

@ -4,9 +4,8 @@ use rumqttc::Publish;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};
use super::ntfy::Priority; use super::ntfy::Priority;
use super::{Device, Notification}; use super::{Device, LuaDeviceCreate, Notification};
use crate::config::MqttDeviceConfig; use crate::config::MqttDeviceConfig;
use crate::error::DeviceConfigError;
use crate::event::{self, Event, EventChannel, OnMqtt}; use crate::event::{self, Event, EventChannel, OnMqtt};
use crate::messages::PowerMessage; use crate::messages::PowerMessage;
use crate::mqtt::WrappedAsyncClient; use crate::mqtt::WrappedAsyncClient;
@ -27,14 +26,17 @@ pub struct WasherConfig {
// TODO: Add google home integration // TODO: Add google home integration
#[derive(Debug, LuaDevice)] #[derive(Debug, LuaDevice)]
pub struct Washer { pub struct Washer {
#[config]
config: WasherConfig, config: WasherConfig,
running: isize, running: isize,
} }
impl Washer { #[async_trait]
async fn create(config: WasherConfig) -> Result<Self, DeviceConfigError> { impl LuaDeviceCreate for Washer {
type Config = WasherConfig;
type Error = rumqttc::ClientError;
async fn create(config: Self::Config) -> Result<Self, Self::Error> {
trace!(id = config.identifier, "Setting up Washer"); trace!(id = config.identifier, "Setting up Washer");
config config

View File

@ -92,13 +92,9 @@ impl MissingWildcard {
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum DeviceConfigError { pub enum DeviceConfigError {
#[error("Child '{1}' of device '{0}' does not exist")]
MissingChild(String, String),
#[error("Device '{0}' does not implement expected trait '{1}'")] #[error("Device '{0}' does not implement expected trait '{1}'")]
MissingTrait(String, String), MissingTrait(String, String),
#[error(transparent)] #[error(transparent)]
MissingWildcard(#[from] MissingWildcard),
#[error(transparent)]
MqttClientError(#[from] rumqttc::ClientError), MqttClientError(#[from] rumqttc::ClientError),
} }