use serde::{Deserialize, Serialize}; use crate::{ commands::{Command, CommandRequest, RequestParserError, empty_command_response}, request_tokenizer::RequestTokenizer, types::SongPosition, }; pub struct Swap; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct SwapRequest { pub songpos1: SongPosition, pub songpos2: SongPosition, } impl CommandRequest for SwapRequest { const COMMAND: &'static str = "swap"; fn into_request_enum(self) -> crate::Request { crate::Request::Swap(self.songpos1, self.songpos2) } fn from_request_enum(request: crate::Request) -> Option { match request { crate::Request::Swap(songpos1, songpos2) => Some(SwapRequest { songpos1, songpos2 }), _ => None, } } fn serialize(&self) -> String { format!("{} {} {}\n", Self::COMMAND, self.songpos1, self.songpos2) } fn parse(mut parts: RequestTokenizer<'_>) -> Result { let songpos1 = parts.next().ok_or(RequestParserError::UnexpectedEOF)?; let songpos1 = songpos1 .parse() .map_err(|_| RequestParserError::SyntaxError(0, songpos1.to_string()))?; let songpos2 = parts.next().ok_or(RequestParserError::UnexpectedEOF)?; let songpos2 = songpos2 .parse() .map_err(|_| RequestParserError::SyntaxError(0, songpos2.to_string()))?; debug_assert!(parts.next().is_none()); Ok(SwapRequest { songpos1, songpos2 }) } } empty_command_response!(Swap); impl Command for Swap { type Request = SwapRequest; type Response = SwapResponse; }