1
use crate::{
2
    commands::{
3
        Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
4
        ResponseParserError,
5
    },
6
    filter::parse_filter,
7
};
8

            
9
pub struct SearchAddPl;
10

            
11
impl Command for SearchAddPl {
12
    type Response = ();
13
    const COMMAND: &'static str = "searchaddpl";
14

            
15
    fn parse_request(mut parts: std::str::SplitWhitespace<'_>) -> RequestParserResult<'_> {
16
        let playlist_name = parts
17
            .next()
18
            .ok_or(RequestParserError::UnexpectedEOF)?
19
            .to_string();
20

            
21
        let filter = parse_filter(&mut parts)?;
22

            
23
        let mut sort_or_window_or_position = parts.next();
24
        let mut sort = None;
25
        if let Some("sort") = sort_or_window_or_position {
26
            sort = Some(
27
                parts
28
                    .next()
29
                    .ok_or(RequestParserError::UnexpectedEOF)?
30
                    .to_string(),
31
            );
32
            sort_or_window_or_position = parts.next();
33
        }
34

            
35
        let mut window = None;
36
        if let Some("window") = sort_or_window_or_position {
37
            let w = parts.next().ok_or(RequestParserError::UnexpectedEOF)?;
38
            window = Some(
39
                w.parse()
40
                    .map_err(|_| RequestParserError::SyntaxError(0, w.to_string()))?,
41
            );
42
            sort_or_window_or_position = parts.next();
43
        }
44

            
45
        let mut position = None;
46
        if let Some("position") = sort_or_window_or_position {
47
            let p = parts.next().ok_or(RequestParserError::UnexpectedEOF)?;
48
            position = Some(
49
                p.parse()
50
                    .map_err(|_| RequestParserError::SyntaxError(0, p.to_string()))?,
51
            );
52
        }
53

            
54
        debug_assert!(parts.next().is_none());
55

            
56
        Ok((
57
            Request::SearchAddPl(playlist_name, filter, sort, window, position),
58
            "",
59
        ))
60
    }
61

            
62
    fn parse_response(
63
        parts: ResponseAttributes<'_>,
64
    ) -> Result<Self::Response, ResponseParserError> {
65
        debug_assert!(parts.is_empty());
66
        Ok(())
67
    }
68
}