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,
}