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