1
use std::collections::HashMap;
2

            
3
use crate::{
4
    commands::{
5
        get_and_parse_property, get_optional_property, get_property, Command, Request,
6
        RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
7
    },
8
    common::Offset,
9
};
10

            
11
pub struct ReadPicture;
12

            
13
pub struct ReadPictureResponse {
14
    pub size: usize,
15
    pub binary: Vec<u8>,
16
    pub mimetype: Option<String>,
17
}
18

            
19
impl Command for ReadPicture {
20
    type Response = Option<ReadPictureResponse>;
21
    const COMMAND: &'static str = "readpicture";
22

            
23
    fn parse_request(mut parts: std::str::SplitWhitespace<'_>) -> RequestParserResult<'_> {
24
        let uri = match parts.next() {
25
            Some(s) => s,
26
            None => return Err(RequestParserError::UnexpectedEOF),
27
        };
28

            
29
        let offset = match parts.next() {
30
            Some(s) => s
31
                .parse::<Offset>()
32
                .map_err(|_| RequestParserError::SyntaxError(1, s.to_owned()))?,
33
            None => return Err(RequestParserError::UnexpectedEOF),
34
        };
35

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

            
38
        Ok((Request::ReadPicture(uri.to_string(), offset), ""))
39
    }
40

            
41
    fn parse_response(
42
        parts: ResponseAttributes<'_>,
43
    ) -> Result<Self::Response, ResponseParserError> {
44
        let parts: HashMap<_, _> = parts.into();
45

            
46
        if parts.is_empty() {
47
            return Ok(None);
48
        }
49

            
50
        let size = get_and_parse_property!(parts, "size", Text);
51

            
52
        let binary = get_property!(parts, "binary", Binary).into();
53

            
54
        let mimetype = get_optional_property!(parts, "mimetype", Text).map(|s| s.to_string());
55

            
56
        Ok(Some(ReadPictureResponse {
57
            size,
58
            binary,
59
            mimetype,
60
        }))
61
    }
62
}