1
use std::str::FromStr;
2

            
3
use crate::{
4
    commands::{CommandRequest, RequestParserError, empty_command_response},
5
    request_tokenizer::RequestTokenizer,
6
    types::SubSystem,
7
};
8

            
9
pub struct IdleRequest(Option<Vec<SubSystem>>);
10

            
11
impl IdleRequest {
12
    pub fn new(subsystems: Option<Vec<SubSystem>>) -> Self {
13
        IdleRequest(subsystems)
14
    }
15
}
16

            
17
impl CommandRequest for IdleRequest {
18
    type Response = IdleResponse;
19

            
20
    const COMMAND: &'static str = "idle";
21
    const MIN_ARGS: u32 = 0;
22
    const MAX_ARGS: Option<u32> = None;
23

            
24
    fn serialize(&self) -> String {
25
        match &self.0 {
26
            Some(subsystems) => {
27
                let subsystems_str = subsystems
28
                    .iter()
29
                    .map(|subsystem| subsystem.to_string())
30
                    .collect::<Vec<_>>()
31
                    .join(",");
32
                format!("{} {}\n", Self::COMMAND, subsystems_str)
33
            }
34
            None => Self::COMMAND.to_string() + "\n",
35
        }
36
    }
37

            
38
    fn parse(parts: RequestTokenizer<'_>) -> Result<Self, RequestParserError> {
39
        let mut parts = parts;
40
        let result = parts.next().map_or(Ok(None), |subsystems| {
41
            let subsystems = subsystems
42
                .split(',')
43
                .map(|subsystem| SubSystem::from_str(subsystem).unwrap())
44
                .collect();
45
            Ok(Some(subsystems))
46
        });
47

            
48
        result.map(IdleRequest)
49
    }
50
}
51

            
52
empty_command_response!(Idle);