rship-govee 0.1.1

rship executor for controlling Govee smart home devices
Documentation
use schemars::JsonSchema;
use serde::{Deserialize, Deserializer, Serialize};

// Helper function to deserialize string or number to u32
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),
    }
}

// Helper function to deserialize string or number to u8
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,
}