1
use crate::commands::{
2
    Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
3
    ResponseParserError,
4
};
5

            
6
pub struct Load;
7

            
8
impl Command for Load {
9
    type Response = ();
10
    const COMMAND: &'static str = "load";
11

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

            
18
        let mut range = None;
19
        let mut pos = None;
20

            
21
        for _ in 0..2 {
22
            if let Some(range_or_pos) = parts.next() {
23
                if range_or_pos.contains(':') {
24
                    range = Some(range_or_pos.parse().map_err(|_| {
25
                        RequestParserError::SyntaxError(0, range_or_pos.to_owned())
26
                    })?);
27
                } else {
28
                    pos = Some(range_or_pos.parse().map_err(|_| {
29
                        RequestParserError::SyntaxError(0, range_or_pos.to_owned())
30
                    })?);
31
                }
32
            }
33
        }
34

            
35
        debug_assert!(parts.next().is_none());
36

            
37
        Ok((Request::Load(playlist_name, range, pos), ""))
38
    }
39

            
40
    fn parse_response(
41
        parts: ResponseAttributes<'_>,
42
    ) -> Result<Self::Response, ResponseParserError> {
43
        debug_assert!(parts.is_empty());
44
        Ok(())
45
    }
46
}