1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use serde::Deserialize;
use serde_plain::derive_fromstr_from_deserialize;
use serde_with::{formats::CommaSeparator, serde_as, StringWithSeparator};

#[derive(Debug, Deserialize, Clone)]
#[cfg_attr(feature = "tests_deny_unknown_fields", serde(deny_unknown_fields))]
pub struct ResourcesMediaContainer {
    #[serde(rename = "Player")]
    pub player: Player,
    #[serde(rename = "@size")]
    pub size: Option<u32>,
}

#[serde_as]
#[derive(Debug, Deserialize, Clone)]
#[cfg_attr(feature = "tests_deny_unknown_fields", serde(deny_unknown_fields))]
pub struct Player {
    #[serde(rename = "@machineIdentifier")]
    pub machine_identifier: String,
    #[serde(rename = "@product")]
    pub product: String,
    #[serde(rename = "@protocol")]
    pub protocol: String,
    #[serde(rename = "@protocolVersion")]
    pub protocol_version: u8,
    #[serde(rename = "@deviceClass")]
    pub device_class: DeviceClass,
    #[serde(rename = "@platform")]
    pub platform: String,
    #[serde(rename = "@platformVersion")]
    pub platform_version: String,
    #[serde(rename = "@title")]
    pub title: String,
    #[serde_as(as = "StringWithSeparator::<CommaSeparator, ProtocolCapability>")]
    #[serde(rename = "@protocolCapabilities")]
    pub protocol_capabilities: Vec<ProtocolCapability>,
}

#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "kebab-case")]
pub enum DeviceClass {
    Stb,
    Phone,
    #[cfg(not(feature = "tests_deny_unknown_fields"))]
    #[serde(other)]
    Unknown,
}

#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "kebab-case")]
pub enum ProtocolCapability {
    Mirror,
    Playback,
    #[serde(rename = "playqueues")]
    PlayQueues,
    ProviderPlayback,
    Timeline,
    #[cfg(not(feature = "tests_deny_unknown_fields"))]
    #[serde(other)]
    Unknown,
}

derive_fromstr_from_deserialize!(ProtocolCapability);