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}