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

            
9
pub struct SearchAdd;
10

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

            
15
    fn parse_request(mut parts: std::str::SplitWhitespace<'_>) -> RequestParserResult<'_> {
16
        let filter = parse_filter(&mut parts)?;
17

            
18
        let mut sort_or_window_or_position = parts.next();
19
        let mut sort = None;
20
        if let Some("sort") = sort_or_window_or_position {
21
            sort = Some(
22
                parts
23
                    .next()
24
                    .ok_or(RequestParserError::UnexpectedEOF)?
25
                    .to_string(),
26
            );
27
            sort_or_window_or_position = parts.next();
28
        }
29

            
30
        let mut window = None;
31
        if let Some("window") = sort_or_window_or_position {
32
            let w = parts.next().ok_or(RequestParserError::UnexpectedEOF)?;
33
            window = Some(
34
                w.parse()
35
                    .map_err(|_| RequestParserError::SyntaxError(0, w.to_string()))?,
36
            );
37
            sort_or_window_or_position = parts.next();
38
        }
39

            
40
        let mut position = None;
41
        if let Some("position") = sort_or_window_or_position {
42
            let p = parts.next().ok_or(RequestParserError::UnexpectedEOF)?;
43
            position = Some(
44
                p.parse()
45
                    .map_err(|_| RequestParserError::SyntaxError(0, p.to_string()))?,
46
            );
47
        }
48

            
49
        debug_assert!(parts.next().is_none());
50

            
51
        Ok((Request::SearchAdd(filter, sort, window, position), ""))
52
    }
53

            
54
    fn parse_response(
55
        parts: ResponseAttributes<'_>,
56
    ) -> Result<Self::Response, ResponseParserError> {
57
        debug_assert!(parts.is_empty());
58
        Ok(())
59
    }
60
}