use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
pub mod v1;
pub mod v2;
pub mod v3;
pub const HEADER_LENGTH: usize = 5;
#[derive(Debug, thiserror::Error)]
pub enum TryFromByteError {
#[error("Unknown opcode: {0}")]
UnknownOpcode(u8),
}
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum Opcode {
None = 0,
Play = 1,
Pause = 2,
Resume = 3,
Stop = 4,
Seek = 5,
PlaybackUpdate = 6,
VolumeUpdate = 7,
SetVolume = 8,
PlaybackError = 9,
SetSpeed = 10,
Version = 11,
Ping = 12,
Pong = 13,
Initial = 14,
PlayUpdate = 15,
SetPlaylistItem = 16,
SubscribeEvent = 17,
UnsubscribeEvent = 18,
Event = 19,
}
impl TryFrom<u8> for Opcode {
type Error = TryFromByteError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
Ok(match value {
0 => Opcode::None,
1 => Opcode::Play,
2 => Opcode::Pause,
3 => Opcode::Resume,
4 => Opcode::Stop,
5 => Opcode::Seek,
6 => Opcode::PlaybackUpdate,
7 => Opcode::VolumeUpdate,
8 => Opcode::SetVolume,
9 => Opcode::PlaybackError,
10 => Opcode::SetSpeed,
11 => Opcode::Version,
12 => Opcode::Ping,
13 => Opcode::Pong,
14 => Opcode::Initial,
15 => Opcode::PlayUpdate,
16 => Opcode::SetPlaylistItem,
17 => Opcode::SubscribeEvent,
18 => Opcode::UnsubscribeEvent,
19 => Opcode::Event,
_ => return Err(TryFromByteError::UnknownOpcode(value)),
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
#[repr(u8)]
pub enum PlaybackState {
Idle = 0,
Playing = 1,
Paused = 2,
}
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct PlaybackErrorMessage {
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct VersionMessage {
pub version: u64,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct SetSpeedMessage {
pub speed: f64,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct SetVolumeMessage {
pub volume: f64,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct SeekMessage {
pub time: f64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct FCastService {
pub port: u16,
pub r#type: i32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct FCastNetworkConfig {
pub name: String,
pub addresses: Vec<String>,
pub services: Vec<FCastService>,
}