1
use std::collections::HashMap;
2

            
3
use crate::commands::{
4
    get_and_parse_property, Command, Request, RequestParserError, RequestParserResult,
5
    ResponseAttributes, ResponseParserError,
6
};
7

            
8
pub struct GetFingerprint;
9

            
10
pub struct GetFingerprintResponse {
11
    pub chromaprint: String,
12
}
13

            
14
impl Command for GetFingerprint {
15
    type Response = GetFingerprintResponse;
16
    const COMMAND: &'static str = "getfingerprint";
17

            
18
    fn parse_request(mut parts: std::str::SplitWhitespace<'_>) -> RequestParserResult<'_> {
19
        let uri = parts.next().ok_or(RequestParserError::UnexpectedEOF)?;
20
        let uri = uri
21
            .parse()
22
            .map_err(|_| RequestParserError::SyntaxError(1, uri.to_owned()))?;
23

            
24
        debug_assert!(parts.next().is_none());
25

            
26
        Ok((Request::GetFingerprint(uri), ""))
27
    }
28

            
29
    fn parse_response(
30
        parts: ResponseAttributes<'_>,
31
    ) -> Result<Self::Response, ResponseParserError> {
32
        let parts: HashMap<_, _> = parts.into();
33

            
34
        let chromaprint = get_and_parse_property!(parts, "chromaprint", Text);
35

            
36
        Ok(GetFingerprintResponse { chromaprint })
37
    }
38
}