1
use std::{collections::HashMap, str::FromStr};
2

            
3
use serde::{Deserialize, Serialize};
4

            
5
use crate::{
6
    commands::{
7
        get_property, Command, Request, RequestParserResult, ResponseAttributes,
8
        ResponseParserError,
9
    },
10
    request::ReplayGainModeMode,
11
};
12

            
13
pub struct ReplayGainStatus;
14

            
15
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
16
pub struct ReplayGainStatusResponse {
17
    pub replay_gain_mode: ReplayGainModeMode,
18
}
19

            
20
impl Command for ReplayGainStatus {
21
    type Response = ReplayGainStatusResponse;
22
    const COMMAND: &'static str = "replay_gain_status";
23

            
24
    fn parse_request(mut parts: std::str::SplitWhitespace<'_>) -> RequestParserResult<'_> {
25
        debug_assert!(parts.next().is_none());
26
        Ok((Request::ReplayGainStatus, ""))
27
    }
28

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

            
35
        Ok(ReplayGainStatusResponse {
36
            replay_gain_mode: ReplayGainModeMode::from_str(replay_gain_mode).map_err(|_| {
37
                ResponseParserError::InvalidProperty("replay_gain_mode", replay_gain_mode)
38
            })?,
39
        })
40
    }
41
}