tapo 0.9.0

Unofficial Tapo API Client. Works with TP-Link Tapo smart devices. Tested with light bulbs (L510, L520, L530, L535, L610, L630), light strips (L900, L920, L930), plugs (P100, P105, P110, P110M, P115), power strips (P300, P304M, P306, P316M), hubs (H100), switches (S200B, S200D, S210) and sensors (KE100, T100, T110, T300, T310, T315).
Documentation
use serde::Serialize;

use crate::error::Error;

use crate::responses::TemperatureUnitKE100;

#[derive(Debug, Default, Serialize)]
pub(crate) struct TrvSetDeviceInfoParams {
    #[serde(skip_serializing_if = "Option::is_none", rename = "target_temp")]
    target_temperature: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    frost_protection_on: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    child_protection: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none", rename = "temp_offset")]
    temperature_offset: Option<i8>,
    #[serde(skip_serializing_if = "Option::is_none", rename = "min_temp")]
    min_temperature: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none", rename = "min_control_temp")]
    min_control_temperature: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none", rename = "max_control_temp")]
    max_control_temperature: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none", rename = "temp_unit")]
    temperature_unit: Option<TemperatureUnitKE100>,
}

impl TrvSetDeviceInfoParams {
    pub fn target_temperature(
        mut self,
        value: u8,
        unit: TemperatureUnitKE100,
    ) -> Result<Self, Error> {
        self.target_temperature = Some(value);
        self.temperature_unit = Some(unit);
        self.validate()
    }
    pub fn frost_protection_on(mut self, value: bool) -> Result<Self, Error> {
        self.frost_protection_on = Some(value);
        self.validate()
    }
    pub fn child_protection(mut self, value: bool) -> Result<Self, Error> {
        self.child_protection = Some(value);
        self.validate()
    }
    pub fn temperature_offset(
        mut self,
        value: i8,
        unit: TemperatureUnitKE100,
    ) -> Result<Self, Error> {
        self.temperature_offset = Some(value);
        self.temperature_unit = Some(unit);
        self.validate()
    }
    pub fn min_control_temperature(
        mut self,
        value: u8,
        unit: TemperatureUnitKE100,
    ) -> Result<Self, Error> {
        self.min_control_temperature = Some(value);
        self.temperature_unit = Some(unit);
        self.validate()
    }
    pub fn max_control_temperature(
        mut self,
        value: u8,
        unit: TemperatureUnitKE100,
    ) -> Result<Self, Error> {
        self.max_control_temperature = Some(value);
        self.temperature_unit = Some(unit);
        self.validate()
    }
}

impl TrvSetDeviceInfoParams {
    pub(crate) fn new() -> Self {
        Self::default()
    }

    pub fn validate(self) -> Result<Self, Error> {
        if let Some(temperature_offset) = self.temperature_offset
            && !(-10..=10).contains(&temperature_offset)
        {
            return Err(Error::Validation {
                field: "temperature_offset".to_string(),
                message: "Must be between -10 and 10".to_string(),
            });
        }
        Ok(self)
    }
}