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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
use secrecy::SecretString;
use serde::Deserialize;
use serde_plain::derive_fromstr_from_deserialize;
use serde_with::{formats::CommaSeparator, serde_as, NoneAsEmptyString, StringWithSeparator};
use time::OffsetDateTime;
#[derive(Debug, Deserialize, Clone)]
#[cfg_attr(feature = "tests_deny_unknown_fields", serde(deny_unknown_fields))]
#[serde(rename_all = "camelCase")]
pub struct DevicesMediaContainer {
#[serde(rename = "Device", default)]
pub devices: Vec<Device>,
#[serde(rename = "@size", default)]
pub size: Option<i32>,
#[serde(rename = "@publicAddress")]
pub public_address: Option<String>,
}
#[serde_as]
#[derive(Debug, Deserialize, Clone)]
#[cfg_attr(feature = "tests_deny_unknown_fields", serde(deny_unknown_fields))]
pub struct Device {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@product")]
pub product: String,
#[serde(rename = "@publicAddress")]
pub public_address: String,
#[serde(rename = "@productVersion")]
pub product_version: String,
#[serde(rename = "@platform")]
pub platform: String,
#[serde(rename = "@platformVersion")]
pub platform_version: String,
#[serde(rename = "@device")]
pub device: String,
#[serde(rename = "@model")]
pub model: Option<String>,
#[serde(rename = "@vendor")]
pub vendor: Option<String>,
#[serde_as(as = "StringWithSeparator::<CommaSeparator, Feature>")]
#[serde(rename = "@provides")]
pub provides: Vec<Feature>,
#[serde(rename = "@clientIdentifier")]
pub client_identifier: String,
#[serde(rename = "@version")]
pub version: Option<String>,
#[serde(rename = "@id")]
pub id: Option<u32>,
#[serde(rename = "@token")]
pub token: Option<SecretString>,
#[serde(rename = "@accessToken")]
pub access_token: Option<SecretString>,
#[serde(with = "time::serde::timestamp", rename = "@createdAt")]
pub created_at: OffsetDateTime,
#[serde(with = "time::serde::timestamp", rename = "@lastSeenAt")]
pub last_seen_at: OffsetDateTime,
#[serde_as(as = "StringWithSeparator::<CommaSeparator, String>")]
#[serde(default, rename = "@screenResolution")]
pub screen_resolution: Vec<String>,
#[serde_as(as = "NoneAsEmptyString")]
#[serde(default, rename = "@screenDensity")]
pub screen_density: Option<u16>,
#[serde(rename = "Connection", default)]
pub connections: Vec<Connection>,
#[serde(rename = "@httpsRequired")]
pub https_required: Option<bool>,
#[serde(rename = "@synced")]
pub synced: Option<bool>,
#[serde(rename = "@relay")]
pub relay: Option<bool>,
#[serde(rename = "@publicAddressMatches")]
pub public_address_matches: Option<bool>,
#[serde(rename = "@presence")]
pub presence: Option<bool>,
#[serde(rename = "@owned")]
pub owned: Option<bool>,
#[serde(rename = "@ownerId")]
pub owner_id: Option<u64>,
#[serde(rename = "@home")]
pub home: Option<bool>,
#[serde(rename = "@sourceTitle")]
pub source_title: Option<String>,
#[serde(rename = "SyncList")]
pub sync_list: Option<SyncList>,
#[serde(default = "create_empty_secret_string", rename = "@authToken")]
pub auth_token: SecretString,
#[serde(rename = "@dnsRebindingProtection")]
pub dns_rebinding_protection: Option<bool>,
#[serde(rename = "@natLoopbackSupported")]
pub nat_loopback_supported: Option<bool>,
}
fn create_empty_secret_string() -> SecretString {
SecretString::new("".to_string())
}
#[derive(Debug, Deserialize, Clone)]
#[cfg_attr(feature = "tests_deny_unknown_fields", serde(deny_unknown_fields))]
pub struct SyncList {
#[serde(rename = "@itemsCompleteCount")]
pub items_complete_count: u32,
#[serde(rename = "@totalSize")]
pub total_size: u64,
#[serde(rename = "@version")]
pub version: u32,
}
#[derive(Debug, Deserialize, Clone)]
#[cfg_attr(feature = "tests_deny_unknown_fields", serde(deny_unknown_fields))]
pub struct Connection {
#[serde(with = "http_serde::uri", rename = "@uri")]
pub uri: http::Uri,
#[serde(rename = "@protocol")]
pub protocol: Option<String>,
#[serde(rename = "@address")]
pub address: Option<String>,
#[serde(rename = "@port")]
pub port: Option<u32>,
#[serde(rename = "@local")]
pub local: Option<bool>,
#[serde(rename = "@relay")]
pub relay: Option<bool>,
}
#[derive(Debug, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum Feature {
Server,
Client,
Controller,
Player,
PubsubPlayer,
ProviderPlayback,
SyncTarget,
#[cfg(not(feature = "tests_deny_unknown_fields"))]
#[serde(other)]
Unknown,
}
derive_fromstr_from_deserialize!(Feature);