diff --git a/rustfmt.toml b/rustfmt.toml index 0ddf519..737a08c 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,8 +1,4 @@ newline_style = "Unix" max_width = 140 tab_spaces = 2 -imports_layout = "Horizontal" -merge_imports = true -struct_field_align_threshold = 25 -where_single_line = true edition = "2018" diff --git a/src/error.rs b/src/error.rs index 376ca34..187c5d9 100644 --- a/src/error.rs +++ b/src/error.rs @@ -5,33 +5,31 @@ pub type MpdResult = std::result::Result; #[derive(Clone, Debug, PartialEq)] pub struct Error { - pub message: String, + pub message: String, } impl Error { - pub fn from_str(message: &str) -> Self { - Error { - message: message.to_string(), - } + pub fn from_str(message: &str) -> Self { + Error { + message: message.to_string(), } + } } impl de::Error for Error { - fn custom(msg: T) -> Self { - Error { - message: msg.to_string(), - } - } + fn custom(msg: T) -> Self { + Error { message: msg.to_string() } + } } impl Display for Error { - fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str(&self.message) - } + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str(&self.message) + } } impl std::error::Error for Error { - fn description(&self) -> &str { - &self.message - } + fn description(&self) -> &str { + &self.message + } } diff --git a/src/structs.rs b/src/structs.rs index cf22f20..41a7b32 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -7,44 +7,44 @@ use std::{fmt, time::Duration}; #[derive(Deserialize, Clone, Debug, Default, PartialEq)] #[serde(default)] pub struct Track { - pub file: String, + pub file: String, #[serde(rename = "artistsort")] - pub artist_sort: Option, + pub artist_sort: Option, #[serde(rename = "albumartist")] - pub album_artist: Option, + pub album_artist: Option, #[serde(rename = "albumsort")] - pub album_sort: Option, + pub album_sort: Option, #[serde(rename = "albumartistsort")] - pub album_artist_sort: Option, + pub album_artist_sort: Option, #[serde(deserialize_with = "de_string_or_vec")] #[serde(rename = "performer")] - pub performers: Vec, - pub genre: Option, - pub title: Option, + pub performers: Vec, + pub genre: Option, + pub title: Option, #[serde(deserialize_with = "de_position")] - pub track: Option, - pub album: Option, - pub artist: Option, - pub pos: u32, - pub id: u32, + pub track: Option, + pub album: Option, + pub artist: Option, + pub pos: u32, + pub id: u32, #[serde(rename = "last-modified")] - pub last_modified: Option>, + pub last_modified: Option>, #[serde(rename = "originaldate")] - pub original_date: Option, - pub format: Option, + pub original_date: Option, + pub format: Option, #[serde(deserialize_with = "de_time_float")] - pub duration: Option, - pub label: Option, - pub date: Option, + pub duration: Option, + pub label: Option, + pub date: Option, #[serde(deserialize_with = "de_position")] - pub disc: Option, - pub musicbraiz_trackid: Option, - pub musicbrainz_albumid: Option, - pub musicbrainz_albumartistid: Option, - pub musicbrainz_artistid: Option, + pub disc: Option, + pub musicbraiz_trackid: Option, + pub musicbrainz_albumid: Option, + pub musicbrainz_albumartistid: Option, + pub musicbrainz_artistid: Option, pub musicbrainz_releasetrackid: Option, - pub musicbrainz_trackid: Option, - pub composer: Option, + pub musicbrainz_trackid: Option, + pub composer: Option, } /// An empty struct that can be used as the response data for commands that only ever return `OK` @@ -59,7 +59,7 @@ pub struct UnitResponse {} #[derive(Deserialize, Clone, Debug, Default, PartialEq)] pub struct Position { pub item_position: u16, - pub total_items: Option, + pub total_items: Option, } impl fmt::Display for Position { @@ -81,40 +81,40 @@ impl fmt::Display for Position { #[derive(Deserialize, Clone, Debug, Default, PartialEq)] #[serde(default)] pub struct Status { - pub volume: Option, + pub volume: Option, #[serde(deserialize_with = "de_bint")] - pub repeat: bool, + pub repeat: bool, #[serde(deserialize_with = "de_bint")] - pub random: bool, + pub random: bool, // TODO: make enum - pub single: u8, + pub single: u8, #[serde(deserialize_with = "de_bint")] - pub consume: bool, + pub consume: bool, // an empty playlist still has an ID - pub playlist: u32, + pub playlist: u32, // mpd returns 0 if there is no current playlist pub playlistlength: u32, #[serde(deserialize_with = "de_state")] - pub state: State, - pub song: Option, - pub songid: Option, - pub nextsong: Option, - pub nextsongid: Option, + pub state: State, + pub song: Option, + pub songid: Option, + pub nextsong: Option, + pub nextsongid: Option, #[serde(deserialize_with = "de_time_float")] - pub elapsed: Option, + pub elapsed: Option, #[serde(deserialize_with = "de_time_float")] - pub duration: Option, - pub bitrate: Option, - pub xfade: Option, + pub duration: Option, + pub bitrate: Option, + pub xfade: Option, // 0 if unset - pub mixrampdb: f32, - pub mixrampdelay: Option, + pub mixrampdb: f32, + pub mixrampdelay: Option, // “audio: The format emitted by the decoder plugin during playback, format: samplerate:bits:channels. // See Global Audio Format for a detailed explanation.” // TODO: make struct - pub audio: Option, - pub updating_db: Option, - pub error: Option, + pub audio: Option, + pub updating_db: Option, + pub error: Option, } #[derive(Deserialize, Clone, Debug, PartialEq)] @@ -135,17 +135,17 @@ impl Default for State { #[derive(Deserialize, Clone, Debug, Default, PartialEq)] #[serde(default)] pub struct Stats { - pub artists: u32, - pub albums: u32, - pub songs: u32, + pub artists: u32, + pub albums: u32, + pub songs: u32, #[serde(deserialize_with = "de_time_int")] - pub uptime: Duration, + pub uptime: Duration, #[serde(deserialize_with = "de_time_int")] pub db_playtime: Duration, // TODO: this is a unix era. use some datetime for it - pub db_update: u32, + pub db_update: u32, #[serde(deserialize_with = "de_time_int")] - pub playtime: Duration, + pub playtime: Duration, } /// Deserialization helpers to handle the quirks of mpd’s output. @@ -158,20 +158,26 @@ mod helpers { /// Deserialize time from an integer that represents the seconds. /// mpd uses int for the database stats (e.g. total time played). pub fn de_time_int<'de, D>(deserializer: D) -> Result - where D: de::Deserializer<'de> { + where + D: de::Deserializer<'de>, + { u64::deserialize(deserializer).map(Duration::from_secs) } /// Deserialize time from a float that represents the seconds. /// mpd uses floats for the current status (e.g. time elapsed in song). pub fn de_time_float<'de, D>(deserializer: D) -> Result, D::Error> - where D: de::Deserializer<'de> { + where + D: de::Deserializer<'de>, + { f64::deserialize(deserializer).map(Duration::from_secs_f64).map(Some) } /// Deserialize the playback state. pub fn de_state<'de, D>(deserializer: D) -> Result - where D: de::Deserializer<'de> { + where + D: de::Deserializer<'de>, + { match String::deserialize(deserializer)?.as_ref() { "play" => Ok(State::Play), "pause" => Ok(State::Pause), @@ -184,14 +190,18 @@ mod helpers { } pub fn de_string_or_vec<'de, D>(deserializer: D) -> Result, 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()) } /// mpd uses bints (0 or 1) to represent booleans, /// so we need a special parser for those. pub fn de_bint<'de, D>(deserializer: D) -> Result - where D: de::Deserializer<'de> { + where + D: de::Deserializer<'de>, + { match u8::deserialize(deserializer)? { 0 => Ok(false), 1 => Ok(true), @@ -202,13 +212,15 @@ mod helpers { /// Deserialize a position with an optional total length. /// The input string here is either a number or two numbers separated by `SEPARATOR`. pub fn de_position<'de, D>(deserializer: D) -> Result, D::Error> - where D: de::Deserializer<'de> { + where + D: de::Deserializer<'de>, + { let s = String::deserialize(deserializer)?; let mut ints = s.split(SEPARATOR).filter_map(|s| u16::from_str(s).ok()); if let Some(n) = ints.next() { return Ok(Some(Position { item_position: n, - total_items: ints.next(), + total_items: ints.next(), })); } Ok(None)