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

            
6
pub struct UrlHandlers;
7

            
8
pub type UrlHandlersResponse = Vec<String>;
9

            
10
impl Command for UrlHandlers {
11
    type Response = UrlHandlersResponse;
12
    const COMMAND: &'static str = "urlhandlers";
13

            
14
    fn parse_request(mut parts: std::str::SplitWhitespace<'_>) -> RequestParserResult<'_> {
15
        debug_assert!(parts.next().is_none());
16
        Ok((Request::UrlHandlers, ""))
17
    }
18

            
19
    fn parse_response(
20
        parts: ResponseAttributes<'_>,
21
    ) -> Result<Self::Response, ResponseParserError> {
22
        let parts: Vec<_> = parts.into();
23
        let mut url_handlers = Vec::new();
24
        for (key, value) in parts.into_iter() {
25
            if key != "handler" {
26
                return Err(ResponseParserError::UnexpectedProperty(key));
27
            }
28
            let value = match value {
29
                GenericResponseValue::Text(value) => value,
30
                GenericResponseValue::Binary(_) => {
31
                    return Err(ResponseParserError::UnexpectedPropertyType(
32
                        "handler", "Binary",
33
                    ))
34
                }
35
            };
36
            url_handlers.push(value.to_string());
37
        }
38
        Ok(url_handlers)
39
    }
40
}