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

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

            
9
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10
pub struct SaveRequest {
11
    pub playlist_name: PlaylistName,
12
    pub mode: Option<SaveMode>,
13
}
14

            
15
impl SaveRequest {
16
    pub fn new(playlist_name: PlaylistName, mode: Option<SaveMode>) -> Self {
17
        Self {
18
            playlist_name,
19
            mode,
20
        }
21
    }
22
}
23

            
24
impl CommandRequest for SaveRequest {
25
    type Response = SaveResponse;
26

            
27
    const COMMAND: &'static str = "save";
28
    const MIN_ARGS: u32 = 2;
29
    const MAX_ARGS: Option<u32> = Some(3);
30

            
31
    fn serialize(&self) -> String {
32
        match self.mode.as_ref() {
33
            Some(mode) => {
34
                format!("{} {} {}\n", Self::COMMAND, self.playlist_name, mode)
35
            }
36
            None => {
37
                format!("{} {}\n", Self::COMMAND, self.playlist_name)
38
            }
39
        }
40
    }
41

            
42
    fn parse(mut parts: RequestTokenizer<'_>) -> Result<Self, RequestParserError> {
43
        let playlist_name = parts
44
            .next()
45
            .ok_or(Self::missing_arguments_error(0))?
46
            .to_string();
47

            
48
        let mode = parts
49
            .next()
50
            .map(|m| {
51
                m.parse()
52
                    .map_err(|_| RequestParserError::SyntaxError(0, m.to_string()))
53
            })
54
            .transpose()?;
55

            
56
        Self::throw_if_too_many_arguments(parts)?;
57

            
58
        Ok(SaveRequest {
59
            playlist_name,
60
            mode,
61
        })
62
    }
63
}
64

            
65
empty_command_response!(Save);