use serde::{Deserialize, Serialize}; use crate::{ commands::{Command, CommandRequest, CommandResponse, RequestParserError, ResponseParserError}, request_tokenizer::RequestTokenizer, response_tokenizer::{ResponseAttributes, get_next_and_parse_property}, types::{SongId, SongPosition, Uri}, }; pub struct AddId; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct AddIdRequest { pub uri: Uri, pub position: Option, } impl CommandRequest for AddIdRequest { const COMMAND: &'static str = "addid"; const MIN_ARGS: u32 = 1; const MAX_ARGS: Option = Some(2); fn into_request_enum(self) -> crate::Request { crate::Request::AddId(self.uri, self.position) } fn from_request_enum(request: crate::Request) -> Option { match request { crate::Request::AddId(uri, position) => Some(AddIdRequest { uri, position }), _ => None, } } fn serialize(&self) -> String { match self.position { Some(pos) => format!("{} {} {}\n", Self::COMMAND, self.uri, pos), 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(AddIdRequest { uri: uri.to_string(), position, }) } } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct AddIdResponse { pub id: SongId, } impl CommandResponse for AddIdResponse { fn into_response_enum(self) -> crate::Response { todo!() } fn from_response_enum(response: crate::Response) -> Option { todo!() } fn parse(parts: ResponseAttributes<'_>) -> Result { let parts: Vec<_> = parts.into(); let mut iter = parts.into_iter(); let (key, id) = get_next_and_parse_property!(iter, Text); if key != "Id" { return Err(ResponseParserError::UnexpectedProperty(key.to_string())); } Ok(AddIdResponse { id }) } } impl Command for AddId { type Request = AddIdRequest; type Response = AddIdResponse; }