cast_sender/namespace/
mod.rs1use 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}