Skip to main content

cast_sender/
app.rs

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}