framesmith 0.1.0

A Rust library for controlling Samsung Frame TVs over the local network
Documentation
use serde::Deserialize;
use serde::de::{self, Deserializer};

fn string_or_number_as_u16<'de, D: Deserializer<'de>>(d: D) -> Result<u16, D::Error> {
    #[derive(Deserialize)]
    #[serde(untagged)]
    enum StringOrNum {
        Num(u16),
        Str(String),
    }
    match StringOrNum::deserialize(d)? {
        StringOrNum::Num(n) => Ok(n),
        StringOrNum::Str(s) => s.parse().map_err(de::Error::custom),
    }
}

#[derive(Debug, Clone, Deserialize)]
pub(crate) struct ArtResponse {
    #[serde(default)]
    pub id: Option<String>,
    #[serde(default)]
    pub request_id: Option<String>,
    #[serde(default)]
    pub event: Option<String>,
    #[serde(default)]
    pub status: Option<String>,
    #[serde(default)]
    pub content_list: Option<String>,
    #[serde(default)]
    pub content_id: Option<String>,
    #[serde(default)]
    pub value: Option<String>,
    #[serde(default)]
    pub data: Option<String>,
    #[serde(default)]
    pub matte_type_list: Option<String>,
    #[serde(default)]
    pub matte_color_list: Option<String>,
    #[serde(default)]
    pub filter_list: Option<String>,
    #[serde(default)]
    pub conn_info: Option<String>,
    #[serde(default)]
    pub error_code: Option<serde_json::Value>,
    #[serde(default)]
    pub current_content_id: Option<String>,
    #[serde(default)]
    pub category_id: Option<String>,
    #[serde(default)]
    pub current_rotation_status: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Deserialize)]
pub(crate) struct ConnInfoResponse {
    pub ip: String,
    #[serde(deserialize_with = "string_or_number_as_u16")]
    pub port: u16,
    #[serde(default)]
    pub key: Option<String>,
    #[serde(default)]
    pub secured: Option<bool>,
}

#[derive(Debug, Clone, Deserialize)]
pub(crate) struct ContentListItem {
    pub content_id: String,
    #[serde(default)]
    pub category_id: Option<String>,
    #[serde(default)]
    pub width: Option<u32>,
    #[serde(default)]
    pub height: Option<u32>,
    #[serde(default)]
    pub matte_id: Option<String>,
    #[serde(default)]
    pub portrait_matte_id: Option<String>,
}

#[derive(Debug, Clone, Deserialize)]
pub(crate) struct MatteTypeItem {
    pub matte_id: String,
    #[serde(default)]
    pub matte_type: Option<String>,
}

#[derive(Debug, Clone, Deserialize)]
pub(crate) struct FilterItem {
    pub filter_id: String,
    #[serde(default)]
    pub filter_name: Option<String>,
}

#[derive(Debug, Clone, Deserialize)]
pub(crate) struct ArtmodeSettingsItem {
    pub item: String,
    pub value: String,
}