use schemars::JsonSchema;
use serde::{Deserialize, Deserializer, Serialize};
fn string_or_u32<'de, D>(deserializer: D) -> Result<u32, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum StringOrU32 {
String(String),
Number(u32),
}
match StringOrU32::deserialize(deserializer)? {
StringOrU32::String(s) => s.parse().map_err(serde::de::Error::custom),
StringOrU32::Number(n) => Ok(n),
}
}
fn string_or_u8<'de, D>(deserializer: D) -> Result<u8, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum StringOrU8 {
String(String),
Number(u8),
}
match StringOrU8::deserialize(deserializer)? {
StringOrU8::String(s) => s.parse().map_err(serde::de::Error::custom),
StringOrU8::Number(n) => Ok(n),
}
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct PowerAction {
pub state: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct BrightnessAction {
#[schemars(range(min = 1, max = 100))]
#[serde(deserialize_with = "string_or_u32")]
pub brightness: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ColorAction {
#[serde(deserialize_with = "string_or_u8")]
pub r: u8,
#[serde(deserialize_with = "string_or_u8")]
pub g: u8,
#[serde(deserialize_with = "string_or_u8")]
pub b: u8,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ColorTemperatureAction {
#[schemars(range(min = 2200, max = 6500))]
#[serde(deserialize_with = "string_or_u32")]
pub temperature: u32,
}