1use serde::{Deserialize, Serialize};
8use serde_repr::{Deserialize_repr, Serialize_repr};
9
10pub mod v1;
11pub mod v2;
12pub mod v3;
13
14pub const HEADER_LENGTH: usize = 5;
15
16#[derive(Debug, thiserror::Error)]
17pub enum TryFromByteError {
18 #[error("Unknown opcode: {0}")]
19 UnknownOpcode(u8),
20}
21
22#[derive(Debug, PartialEq, Copy, Clone)]
23pub enum Opcode {
24 None = 0,
26 Play = 1,
28 Pause = 2,
30 Resume = 3,
32 Stop = 4,
34 Seek = 5,
36 PlaybackUpdate = 6,
38 VolumeUpdate = 7,
40 SetVolume = 8,
42 PlaybackError = 9,
44 SetSpeed = 10,
46 Version = 11,
48 Ping = 12,
50 Pong = 13,
52 Initial = 14,
55 PlayUpdate = 15,
57 SetPlaylistItem = 16,
59 SubscribeEvent = 17,
61 UnsubscribeEvent = 18,
63 Event = 19,
65}
66
67impl TryFrom<u8> for Opcode {
68 type Error = TryFromByteError;
69
70 fn try_from(value: u8) -> Result<Self, Self::Error> {
71 Ok(match value {
72 0 => Opcode::None,
73 1 => Opcode::Play,
74 2 => Opcode::Pause,
75 3 => Opcode::Resume,
76 4 => Opcode::Stop,
77 5 => Opcode::Seek,
78 6 => Opcode::PlaybackUpdate,
79 7 => Opcode::VolumeUpdate,
80 8 => Opcode::SetVolume,
81 9 => Opcode::PlaybackError,
82 10 => Opcode::SetSpeed,
83 11 => Opcode::Version,
84 12 => Opcode::Ping,
85 13 => Opcode::Pong,
86 14 => Opcode::Initial,
87 15 => Opcode::PlayUpdate,
88 16 => Opcode::SetPlaylistItem,
89 17 => Opcode::SubscribeEvent,
90 18 => Opcode::UnsubscribeEvent,
91 19 => Opcode::Event,
92 _ => return Err(TryFromByteError::UnknownOpcode(value)),
93 })
94 }
95}
96
97#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
98#[repr(u8)]
99pub enum PlaybackState {
100 Idle = 0,
101 Playing = 1,
102 Paused = 2,
103}
104
105#[allow(dead_code)]
106#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
107pub struct PlaybackErrorMessage {
108 pub message: String,
109}
110
111#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
112pub struct VersionMessage {
113 pub version: u64,
114}
115
116#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
117pub struct SetSpeedMessage {
118 pub speed: f64,
119}
120
121#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
122pub struct SetVolumeMessage {
123 pub volume: f64,
124}
125
126#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
127pub struct SeekMessage {
128 pub time: f64,
129}
130
131#[derive(Debug, Serialize, Deserialize)]
132pub struct FCastService {
133 pub port: u16,
134 pub r#type: i32,
135}
136
137#[derive(Debug, Serialize, Deserialize)]
138pub struct FCastNetworkConfig {
139 pub name: String,
140 pub addresses: Vec<String>,
141 pub services: Vec<FCastService>,
142}