1
use crate::{
2
    commands::{
3
        Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
4
        ResponseParserError,
5
    },
6
    common::TimeWithFractions,
7
    request::SeekMode,
8
};
9

            
10
pub struct SeekCur;
11

            
12
impl Command for SeekCur {
13
    type Response = ();
14
    const COMMAND: &'static str = "seekcur";
15

            
16
    fn parse_request(mut parts: std::str::SplitWhitespace<'_>) -> RequestParserResult<'_> {
17
        let time_raw = match parts.next() {
18
            Some(t) => t,
19
            None => return Err(RequestParserError::UnexpectedEOF),
20
        };
21

            
22
        // TODO: DRY
23
        let (mode, time) = match time_raw {
24
            t if t.starts_with('+') => (
25
                SeekMode::Relative,
26
                t[1..]
27
                    .parse::<TimeWithFractions>()
28
                    .map_err(|_| RequestParserError::SyntaxError(0, t.to_owned()))?,
29
            ),
30
            t if t.starts_with('-') => (
31
                SeekMode::Relative,
32
                -t[1..]
33
                    .parse::<TimeWithFractions>()
34
                    .map_err(|_| RequestParserError::SyntaxError(0, t.to_owned()))?,
35
            ),
36
            t => (
37
                SeekMode::Absolute,
38
                t.parse::<TimeWithFractions>()
39
                    .map_err(|_| RequestParserError::SyntaxError(0, t.to_owned()))?,
40
            ),
41
        };
42

            
43
        debug_assert!(parts.next().is_none());
44

            
45
        Ok((Request::SeekCur(mode, time), ""))
46
    }
47

            
48
    fn parse_response(
49
        parts: ResponseAttributes<'_>,
50
    ) -> Result<Self::Response, ResponseParserError> {
51
        debug_assert!(parts.is_empty());
52
        Ok(())
53
    }
54
}