mpd_easy/
status.rs

1use std::fmt;
2
3use serde::Serialize;
4
5use crate::se::serialize_time;
6use crate::{time::Time, OnOff};
7
8#[derive(Debug, Serialize, PartialEq)]
9pub enum State {
10    Stop,
11    Play,
12    Pause,
13}
14
15impl fmt::Display for State {
16    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17        let state = match self {
18            State::Stop => "stop",
19            State::Play => "play",
20            State::Pause => "pause",
21        };
22        write!(f, "{state}")
23    }
24}
25
26impl From<mpd::State> for State {
27    fn from(state: mpd::State) -> Self {
28        match state {
29            mpd::State::Stop => State::Stop,
30            mpd::State::Play => State::Play,
31            mpd::State::Pause => State::Pause,
32        }
33    }
34}
35
36#[derive(Debug, Serialize)]
37pub struct Status {
38    pub volume: String,
39    pub state: State,
40    pub artist: String,
41    pub album: String,
42    pub title: String,
43    pub position: u32,
44    pub queue_count: u32,
45    #[serde(serialize_with = "serialize_time")]
46    pub elapsed: Time,
47    #[serde(serialize_with = "serialize_time")]
48    pub track_length: Time,
49    pub repeat: OnOff,
50    pub random: OnOff,
51    pub single: OnOff,
52    pub consume: OnOff,
53    pub file_path: Option<String>,
54}
55
56impl fmt::Display for Status {
57    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58        write!(
59            f,
60            "volume={}\nstate={}\nartist={}\nalbum={}\ntitle={}\nposition={}\nqueue_count={}\nelapsed={}\ntrack_length={}\nrepeat={}\nrandom={}\nsingle={}\nconsume={}",
61            self.volume,
62            self.state,
63            self.artist,
64            self.album,
65            self.title,
66            self.position,
67            self.queue_count,
68            self.elapsed,
69            self.track_length,
70            self.repeat,
71            self.random,
72            self.single,
73            self.consume,
74        )
75    }
76}
77
78#[cfg(test)]
79mod tests {
80    use super::*;
81    use crate::time::Time;
82    use crate::OnOff;
83
84    #[test]
85    fn test_status_display_format() {
86        let status = Status {
87            volume: "100".to_string(),
88            state: State::Play,
89            artist: "Phish".to_string(),
90            album: "A Picture Of Nectar".to_string(),
91            title: "Chalk Dust Torture".to_string(),
92            position: 3,
93            queue_count: 10,
94            elapsed: Time::from(60),
95            track_length: Time::from(300),
96            repeat: OnOff::Off,
97            random: OnOff::On,
98            single: OnOff::Off,
99            consume: OnOff::Off,
100            file_path: Some("path/to/file".to_string()),
101        };
102
103        let display_output = format!("{status}");
104        let expected_output = "volume=100\nstate=play\nartist=Phish\nalbum=A Picture Of Nectar\ntitle=Chalk Dust Torture\nposition=3\nqueue_count=10\nelapsed=00:01:00\ntrack_length=00:05:00\nrepeat=off\nrandom=on\nsingle=off\nconsume=off";
105
106        assert_eq!(display_output, expected_output);
107    }
108}