1use std::str::FromStr;
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use strum_macros::{Display, EnumString};
5
6use crate::namespace::NamespaceUrn;
7
8#[derive(Serialize, Deserialize, Clone, Debug, Default)]
9#[serde(rename_all = "camelCase")]
10pub struct App {
11 pub app_id: AppId,
12 pub app_type: String,
13 pub display_name: String,
14 pub icon_url: String,
15 pub is_idle_screen: bool,
16 pub launched_from_cloud: bool,
17 pub namespaces: Vec<NamespaceUrn>,
18 pub session_id: String,
19 pub status_text: String,
20 pub transport_id: String,
21 pub universal_app_id: String,
22}
23
24impl App {
25 pub fn receiver() -> Self {
26 Self {
27 transport_id: "receiver-0".into(),
28 namespaces: vec![
29 NamespaceUrn::Connection,
30 NamespaceUrn::Heartbeat,
31 NamespaceUrn::Receiver,
32 NamespaceUrn::DeviceAuth,
33 ],
34 ..Default::default()
35 }
36 }
37}
38
39#[derive(EnumString, Display, Debug, Clone, Default, PartialEq, Eq)]
40pub enum AppId {
41 #[default]
42 #[strum(serialize = "CC1AD845")]
43 DefaultMediaReceiver,
44 #[strum(serialize = "E8C28D3C")]
45 Backdrop,
46 #[strum(serialize = "233637DE")]
47 YouTube,
48 #[strum(default)]
49 Custom(String),
50}
51
52impl<'de> Deserialize<'de> for AppId {
53 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54 where
55 D: Deserializer<'de>,
56 {
57 let id = String::deserialize(deserializer)?;
58 AppId::from_str(&id).map_err(serde::de::Error::custom)
59 }
60}
61
62impl Serialize for AppId {
63 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
64 where
65 S: Serializer,
66 {
67 self.to_string().serialize(serializer)
68 }
69}