snapcast_control/protocol/
notification.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{client, group, server, stream};
4
5/// A notification from the Snapcast server
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
7#[serde(tag = "method")]
8pub enum Notification {
9  // client
10  #[serde(rename = "Client.OnConnect")]
11  ClientOnConnect { params: Box<client::OnConnectParams> },
12  #[serde(rename = "Client.OnDisconnect")]
13  ClientOnDisconnect { params: Box<client::OnDisconnectParams> },
14  #[serde(rename = "Client.OnVolumeChanged")]
15  ClientOnVolumeChanged { params: Box<client::OnVolumeChangedParams> },
16  #[serde(rename = "Client.OnLatencyChanged")]
17  ClientOnLatencyChanged {
18    params: Box<client::OnLatencyChangedParams>,
19  },
20  #[serde(rename = "Client.OnNameChanged")]
21  ClientOnNameChanged { params: Box<client::OnNameChangedParams> },
22
23  // group
24  #[serde(rename = "Group.OnMute")]
25  GroupOnMute { params: Box<group::OnMuteParams> },
26  #[serde(rename = "Group.OnStreamChanged")]
27  GroupOnStreamChanged { params: Box<group::OnStreamChangedParams> },
28  #[serde(rename = "Group.OnNameChanged")]
29  GroupOnNameChanged { params: Box<group::OnNameChangedParams> },
30
31  // server
32  #[serde(rename = "Server.OnUpdate")]
33  ServerOnUpdate { params: Box<server::OnUpdateParams> },
34
35  // stream
36  #[serde(rename = "Stream.OnUpdate")]
37  StreamOnUpdate { params: Box<stream::OnUpdateParams> },
38  #[serde(rename = "Stream.OnProperties")]
39  StreamOnProperties { params: Box<stream::OnPropertiesParams> },
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
43pub enum NotificationType {
44  // client
45  #[serde(rename = "Client.OnConnect")]
46  ClientOnConnect,
47  #[serde(rename = "Client.OnDisconnect")]
48  ClientOnDisconnect,
49  #[serde(rename = "Client.OnVolumeChanged")]
50  ClientOnVolumeChanged,
51  #[serde(rename = "Client.OnLatencyChanged")]
52  ClientOnLatencyChanged,
53  #[serde(rename = "Client.OnNameChanged")]
54  ClientOnNameChanged,
55
56  // group
57  #[serde(rename = "Group.OnMute")]
58  GroupOnMute,
59  #[serde(rename = "Group.OnStreamChanged")]
60  GroupOnStreamChanged,
61  #[serde(rename = "Group.OnNameChanged")]
62  GroupOnNameChanged,
63
64  // server
65  #[serde(rename = "Server.OnUpdate")]
66  ServerOnUpdate,
67
68  // stream
69  #[serde(rename = "Stream.OnUpdate")]
70  StreamOnUpdate,
71  #[serde(rename = "Stream.OnProperties")]
72  StreamOnProperties,
73}
74
75pub(crate) struct NotificationMethodConverter(pub NotificationType, pub serde_json::Value);
76
77impl TryFrom<NotificationMethodConverter> for Notification {
78  type Error = serde_json::Error;
79
80  fn try_from(value: NotificationMethodConverter) -> Result<Self, Self::Error> {
81    let NotificationMethodConverter(method, params) = value;
82
83    match method {
84      // client
85      NotificationType::ClientOnConnect => Ok(Notification::ClientOnConnect {
86        params: serde_json::from_value(params)?,
87      }),
88      NotificationType::ClientOnDisconnect => Ok(Notification::ClientOnDisconnect {
89        params: serde_json::from_value(params)?,
90      }),
91      NotificationType::ClientOnVolumeChanged => Ok(Notification::ClientOnVolumeChanged {
92        params: serde_json::from_value(params)?,
93      }),
94      NotificationType::ClientOnLatencyChanged => Ok(Notification::ClientOnLatencyChanged {
95        params: serde_json::from_value(params)?,
96      }),
97      NotificationType::ClientOnNameChanged => Ok(Notification::ClientOnNameChanged {
98        params: serde_json::from_value(params)?,
99      }),
100
101      // group
102      NotificationType::GroupOnMute => Ok(Notification::GroupOnMute {
103        params: serde_json::from_value(params)?,
104      }),
105      NotificationType::GroupOnStreamChanged => Ok(Notification::GroupOnStreamChanged {
106        params: serde_json::from_value(params)?,
107      }),
108      NotificationType::GroupOnNameChanged => Ok(Notification::GroupOnNameChanged {
109        params: serde_json::from_value(params)?,
110      }),
111
112      // server
113      NotificationType::ServerOnUpdate => Ok(Notification::ServerOnUpdate {
114        params: serde_json::from_value(params)?,
115      }),
116
117      // stream
118      NotificationType::StreamOnUpdate => Ok(Notification::StreamOnUpdate {
119        params: serde_json::from_value(params)?,
120      }),
121      NotificationType::StreamOnProperties => Ok(Notification::StreamOnProperties {
122        params: serde_json::from_value(params)?,
123      }),
124    }
125  }
126}