use serde;
use serde::{Serialize, Deserialize};
use crate::errors::WledJsonApiError;
use crate::structures::cfg::cfg_ap::Ap;
use crate::structures::cfg::cfg_def::Def;
use crate::structures::cfg::cfg_dmx::Dmx;
use crate::structures::cfg::cfg_eth::Eth;
use crate::structures::cfg::cfg_hw::Hw;
use crate::structures::cfg::cfg_id::Id;
use crate::structures::cfg::cfg_if2::If2;
use crate::structures::cfg::cfg_light::Light;
use crate::structures::cfg::cfg_nw::Nw;
use crate::structures::cfg::cfg_ol::Ol;
use crate::structures::cfg::cfg_ota::Ota;
use crate::structures::cfg::cfg_remote::Remote;
use crate::structures::cfg::cfg_timers::Timers;
use crate::structures::cfg::cfg_wifi::Wifi;
use crate::structures::none_function;
pub mod cfg_id;
pub mod cfg_nw;
pub mod cfg_ap;
pub mod cfg_eth;
pub mod cfg_wifi;
pub mod cfg_hw;
pub mod cfg_light;
pub mod cfg_def;
pub mod cfg_if2;
pub mod cfg_remote;
pub mod cfg_ol;
pub mod cfg_timers;
pub mod cfg_ota;
pub mod cfg_dmx;
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Cfg {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub rev: Option<Vec<u32>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub vid: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub id: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub nw: Option<Nw>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub eth: Option<Eth>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub ap: Option<Ap>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub wifi: Option<Wifi>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub hw: Option<Hw>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub light: Option<Light>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub def: Option<Def>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
#[serde(rename = "if")]
pub if_field: Option<If2>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub remote: Option<Remote>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub ol: Option<Ol>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub timers: Option<Timers>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub ota: Option<Ota>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub dmx: Option<Dmx>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default = "none_function")]
pub um: Option<serde_json::Value>,
}
impl TryFrom<&str> for Cfg{
type Error = WledJsonApiError;
fn try_from(str_in: &str) -> Result<Cfg, WledJsonApiError> {
serde_json::from_str(str_in).map_err(|e| {WledJsonApiError::SerdeError(e)})
}
}
impl TryInto<String> for &Cfg{
type Error = WledJsonApiError;
fn try_into(self) -> Result<String, WledJsonApiError> {
serde_json::to_string(self).map_err(|e| {WledJsonApiError::SerdeError(e)})
}
}