use serde::{Deserialize, Serialize}; use crate::{ commands::{Command, CommandRequest, RequestParserError, empty_command_response}, request_tokenizer::RequestTokenizer, types::{SongPosition, Uri}, }; 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"; const MIN_ARGS: u32 = 1; const MAX_ARGS: Option = Some(2); 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!("{} {} {}\n", Self::COMMAND, self.uri, position), None => format!("{} {}\n", Self::COMMAND, self.uri), } } fn parse(mut parts: RequestTokenizer<'_>) -> Result { let uri = match parts.next() { Some(s) => s, None => return Err(Self::missing_arguments_error(0)), }; let position = match parts.next() { Some(s) => Some(s.parse::().map_err(|_| { RequestParserError::SubtypeParserError { argument_index: 1, expected_type: "SongPosition".to_string(), raw_input: s.to_owned(), } })?), None => None, }; Self::throw_if_too_many_arguments(parts)?; Ok(AddRequest { uri: uri.to_string(), position, }) } } empty_command_response!(Add); impl Command for Add { type Request = AddRequest; type Response = AddResponse; }