1
use serde::{Deserialize, Serialize};
2

            
3
use crate::{
4
    commands::{Command, CommandRequest, RequestParserError, empty_command_response},
5
    request_tokenizer::RequestTokenizer,
6
    types::{SongId, TimeInterval},
7
};
8

            
9
pub struct RangeId;
10

            
11
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12
pub struct RangeIdRequest {
13
    songid: SongId,
14
    time_interval: TimeInterval,
15
}
16

            
17
impl RangeIdRequest {
18
    pub fn new(songid: SongId, time_interval: TimeInterval) -> Self {
19
        Self {
20
            songid,
21
            time_interval,
22
        }
23
    }
24
}
25

            
26
impl CommandRequest for RangeIdRequest {
27
    const COMMAND: &'static str = "rangeid";
28
    const MIN_ARGS: u32 = 2;
29
    const MAX_ARGS: Option<u32> = Some(2);
30

            
31
    fn into_request_enum(self) -> crate::Request {
32
        crate::Request::RangeId(self.songid, self.time_interval)
33
    }
34

            
35
    fn from_request_enum(request: crate::Request) -> Option<Self> {
36
        match request {
37
            crate::Request::RangeId(songid, time_interval) => Some(RangeIdRequest {
38
                songid,
39
                time_interval,
40
            }),
41
            _ => None,
42
        }
43
    }
44

            
45
    fn serialize(&self) -> String {
46
        format!("{} {} {}\n", Self::COMMAND, self.songid, self.time_interval)
47
    }
48

            
49
    fn parse(mut parts: RequestTokenizer<'_>) -> Result<Self, RequestParserError> {
50
        let songid = parts.next().ok_or(Self::missing_arguments_error(0))?;
51
        let songid = songid
52
            .parse()
53
            .map_err(|_| RequestParserError::SubtypeParserError {
54
                argument_index: 0,
55
                expected_type: "SongId",
56
                raw_input: songid.to_string(),
57
            })?;
58

            
59
        let time_interval = parts.next().ok_or(Self::missing_arguments_error(1))?;
60
        let time_interval =
61
            time_interval
62
                .parse()
63
                .map_err(|_| RequestParserError::SubtypeParserError {
64
                    argument_index: 1,
65
                    expected_type: "TimeInterval",
66
                    raw_input: time_interval.to_string(),
67
                })?;
68

            
69
        Self::throw_if_too_many_arguments(parts)?;
70

            
71
        Ok(RangeIdRequest {
72
            songid,
73
            time_interval,
74
        })
75
    }
76
}
77

            
78
empty_command_response!(RangeId);
79

            
80
impl Command for RangeId {
81
    type Request = RangeIdRequest;
82
    type Response = RangeIdResponse;
83
}