use serde::{Deserialize, Serialize}; use crate::{ commands::{Command, CommandRequest, RequestParserError, empty_command_response}, common::types::{SongPosition, Uri}, request_tokenizer::RequestTokenizer, }; pub struct Add; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct AddRequest { uri: Uri, position: Option, } impl CommandRequest<'_> for AddRequest { const COMMAND: &'static str = "add"; fn into_request_enum(self) -> crate::Request { crate::Request::Add(self.uri, self.position) } fn from_request_enum(request: crate::Request) -> Option { match request { crate::Request::Add(uri, position) => Some(AddRequest { uri, position }), _ => None, } } fn serialize(&self) -> String { match self.position { Some(position) => format!("{} {} {}", Self::COMMAND, self.uri, position), None => format!("{} {}", Self::COMMAND, self.uri), } } fn parse(mut parts: RequestTokenizer<'_>) -> Result { let uri = match parts.next() { Some(s) => s, None => return Err(RequestParserError::UnexpectedEOF), }; let position = match parts.next() { Some(s) => Some( s.parse::() .map_err(|_| RequestParserError::SyntaxError(1, s.to_owned()))?, ), None => None, }; debug_assert!(parts.next().is_none()); Ok(AddRequest { uri: uri.to_string(), position, }) } } empty_command_response!(Add); impl Command<'_, '_> for Add { type Request = AddRequest; type Response = AddResponse; }