Make playback state an enum

This commit is contained in:
kageru 2020-06-21 23:03:42 +02:00
parent 324648d9a7
commit 9fb4513fbc
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
2 changed files with 32 additions and 4 deletions

View File

@ -4,7 +4,7 @@ mod error;
use error::{Error, MpdResult}; use error::{Error, MpdResult};
use itertools::Itertools; use itertools::Itertools;
mod structs; mod structs;
pub use structs::{Position, Stats, Status, Track}; pub use structs::{Position, Stats, Status, Track, State};
/// some unprintable character to separate repeated keys /// some unprintable character to separate repeated keys
const SEPARATOR: char = '\x02'; const SEPARATOR: char = '\x02';
@ -202,7 +202,7 @@ OK";
playlist: 6, playlist: 6,
playlistlength: 5364, playlistlength: 5364,
mixrampdb: 0.0, mixrampdb: 0.0,
state: String::from("play"), state: State::Play,
song: Some(3833), song: Some(3833),
songid: Some(3834), songid: Some(3834),
elapsed: Some(Duration::from_secs_f64(69.642)), elapsed: Some(Duration::from_secs_f64(69.642)),

View File

@ -89,8 +89,8 @@ pub struct Status {
pub playlist: u32, pub playlist: u32,
// mpd returns 0 if there is no current playlist // mpd returns 0 if there is no current playlist
pub playlistlength: u32, pub playlistlength: u32,
// play, stop, pause. TODO: make an enum #[serde(deserialize_with = "de_state")]
pub state: String, pub state: State,
pub song: Option<u32>, pub song: Option<u32>,
pub songid: Option<u32>, pub songid: Option<u32>,
pub nextsong: Option<u32>, pub nextsong: Option<u32>,
@ -112,6 +112,20 @@ pub struct Status {
pub error: Option<String>, pub error: Option<String>,
} }
#[derive(Deserialize, Clone, Debug, PartialEq)]
pub enum State {
Stop,
Play,
Pause,
}
// Default implementation so I can derive default for containing structs.
impl Default for State {
fn default() -> Self {
Self::Stop
}
}
/// Database statistics as returned by the `stats` command. /// Database statistics as returned by the `stats` command.
#[derive(Deserialize, Clone, Debug, Default, PartialEq)] #[derive(Deserialize, Clone, Debug, Default, PartialEq)]
#[serde(default)] #[serde(default)]
@ -150,6 +164,20 @@ mod helpers {
f64::deserialize(deserializer).map(Duration::from_secs_f64).map(Some) f64::deserialize(deserializer).map(Duration::from_secs_f64).map(Some)
} }
/// Deserialize the playback state.
pub fn de_state<'de, D>(deserializer: D) -> Result<State, D::Error>
where D: de::Deserializer<'de> {
match String::deserialize(deserializer)?.as_ref() {
"play" => Ok(State::Play),
"pause" => Ok(State::Pause),
"stop" => Ok(State::Stop),
s => Err(de::Error::invalid_value(
de::Unexpected::Str(s),
&"expected one of play, pause, or stop",
)),
}
}
pub fn de_string_or_vec<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error> pub fn de_string_or_vec<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
where D: de::Deserializer<'de> { where D: de::Deserializer<'de> {
String::deserialize(deserializer).map(|s| s.split(SEPARATOR).map(std::string::String::from).collect()) String::deserialize(deserializer).map(|s| s.split(SEPARATOR).map(std::string::String::from).collect())