Skip to main content

cast_sender/namespace/
mod.rs

1use std::{collections::HashMap, str::FromStr};
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use serde_json::Value;
5use strum_macros::{Display, EnumString};
6
7use crate::Payload;
8
9pub mod connection;
10pub mod heartbeat;
11pub mod media;
12pub mod multizone;
13pub mod receiver;
14
15#[derive(EnumString, Display, Debug, Clone, Default, PartialEq, Eq)]
16pub enum NamespaceUrn {
17    #[strum(serialize = "urn:x-cast:com.google.cast.cac")]
18    Cac,
19    #[default]
20    #[strum(serialize = "urn:x-cast:com.google.cast.tp.connection")]
21    Connection,
22    #[strum(default)]
23    Custom(String),
24    #[strum(serialize = "urn:x-cast:com.google.cast.debugoverlay")]
25    DebugOverlay,
26    #[strum(serialize = "urn:x-cast:com.google.cast.tp.deviceauth")]
27    DeviceAuth,
28    #[strum(serialize = "urn:x-cast:com.google.cast.tp.heartbeat")]
29    Heartbeat,
30    #[strum(serialize = "urn:x-cast:com.google.cast.media")]
31    Media,
32    #[strum(serialize = "urn:x-cast:com.google.cast.multizone")]
33    Multizone,
34    #[strum(serialize = "urn:x-cast:com.google.cast.receiver")]
35    Receiver,
36    #[strum(serialize = "urn:x-cast:com.google.cast.remotecontrol")]
37    RemoteControl,
38    #[strum(serialize = "urn:x-cast:com.google.cast.sse")]
39    Sse,
40}
41
42#[derive(Serialize, Deserialize, Clone, Debug, Default)]
43#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
44#[serde(tag = "type")]
45pub struct Custom {
46    #[serde(skip)]
47    pub namespace: NamespaceUrn,
48    #[serde(flatten)]
49    pub fields: HashMap<String, Value>,
50}
51
52impl From<Custom> for Payload {
53    fn from(val: Custom) -> Self {
54        Payload::Custom(val.clone())
55    }
56}
57
58impl<'de> Deserialize<'de> for NamespaceUrn {
59    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
60    where
61        D: Deserializer<'de>,
62    {
63        #[derive(Deserialize)]
64        pub struct Namespace {
65            name: String,
66        }
67
68        let ns = Namespace::deserialize(deserializer)?;
69        NamespaceUrn::from_str(&ns.name).map_err(serde::de::Error::custom)
70    }
71}
72
73impl Serialize for NamespaceUrn {
74    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
75    where
76        S: Serializer,
77    {
78        #[derive(Serialize)]
79        pub struct Namespace {
80            name: String,
81        }
82
83        Namespace {
84            name: self.to_string(),
85        }
86        .serialize(serializer)
87    }
88}