use serde::{Deserialize, Serialize}; use crate::{ commands::{Command, CommandRequest, RequestParserError, empty_command_response}, request_tokenizer::RequestTokenizer, types::{Priority, SongId}, }; pub struct PrioId; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct PrioIdRequest { pub prio: Priority, pub songids: Vec, } impl CommandRequest for PrioIdRequest { const COMMAND: &'static str = "prioid"; fn into_request_enum(self) -> crate::Request { crate::Request::PrioId(self.prio, self.songids) } fn from_request_enum(request: crate::Request) -> Option { match request { crate::Request::PrioId(prio, songids) => Some(PrioIdRequest { prio, songids }), _ => None, } } fn serialize(&self) -> String { let songids = self .songids .iter() .map(|id| id.to_string()) .collect::>() .join(","); format!("{} {} {}\n", Self::COMMAND, self.prio, songids) } fn parse(mut parts: RequestTokenizer<'_>) -> Result { let prio = parts.next().ok_or(RequestParserError::UnexpectedEOF)?; let prio = prio .parse() .map_err(|_| RequestParserError::SyntaxError(0, prio.to_string()))?; let songids = parts.next().ok_or(RequestParserError::UnexpectedEOF)?; let songids = songids .split(',') .map(|s| { s.parse() .map_err(|_| RequestParserError::SyntaxError(0, s.to_string())) }) .collect::, RequestParserError>>()?; debug_assert!(parts.next().is_none()); Ok(PrioIdRequest { prio, songids }) } } empty_command_response!(PrioId); impl Command for PrioId { type Request = PrioIdRequest; type Response = PrioIdResponse; }