Move split_properties to CommandResult
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
41a06eb9d1
commit
8e7a087e41
2 changed files with 33 additions and 36 deletions
|
@ -50,8 +50,8 @@ struct PlayerTemplate<'a> {
|
|||
|
||||
async fn get_player(_req: tide::Request<()>) -> tide::Result {
|
||||
let mut mpd = mpd::Mpd::connect().await?;
|
||||
let song = mpd.command("currentsong").await?.as_hashmap();
|
||||
let status = mpd.command("status").await?.as_hashmap();
|
||||
let song = mpd.command("currentsong").await?.into_hashmap();
|
||||
let status = mpd.command("status").await?.into_hashmap();
|
||||
|
||||
let elapsed = status["elapsed"].parse().unwrap_or(0.0);
|
||||
let duration = status["duration"].parse().unwrap_or(1.0);
|
||||
|
|
65
src/mpd.rs
65
src/mpd.rs
|
@ -49,8 +49,32 @@ pub struct CommandResult {
|
|||
}
|
||||
|
||||
impl CommandResult {
|
||||
pub fn as_hashmap<'a>(&'a self) -> HashMap<String, String> {
|
||||
self.properties.iter().cloned().collect()
|
||||
pub fn into_hashmap(self) -> HashMap<String, String> {
|
||||
self.properties.into_iter().collect()
|
||||
}
|
||||
|
||||
pub fn into_hashmaps(self, split_at: &[&str]) -> Vec<HashMap<String, String>> {
|
||||
let mut output = Vec::new();
|
||||
let mut current = None;
|
||||
|
||||
for (key, value) in self.properties {
|
||||
if split_at.contains(&key.as_str()) {
|
||||
if let Some(current) = current {
|
||||
output.push(current);
|
||||
}
|
||||
current = Some(HashMap::new());
|
||||
}
|
||||
|
||||
if let Some(current) = current.as_mut() {
|
||||
current.insert(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(current) = current {
|
||||
output.push(current);
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -222,32 +246,6 @@ impl Mpd {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn split_properties(
|
||||
properties: Vec<(String, String)>,
|
||||
at: &[&str],
|
||||
) -> Vec<HashMap<String, String>> {
|
||||
let mut output = Vec::new();
|
||||
let mut current = None;
|
||||
|
||||
for (key, value) in properties {
|
||||
if at.contains(&key.as_str()) {
|
||||
if let Some(current) = current {
|
||||
output.push(current);
|
||||
}
|
||||
current = Some(HashMap::new());
|
||||
}
|
||||
|
||||
if let Some(current) = current.as_mut() {
|
||||
current.insert(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(current) = current {
|
||||
output.push(current);
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
|
||||
pub async fn ls(&mut self, path: &str) -> anyhow::Result<Vec<Entry>> {
|
||||
fn get_filename(path: &str) -> String {
|
||||
|
@ -259,11 +257,10 @@ impl Mpd {
|
|||
|
||||
let result = self
|
||||
.command(&format!("lsinfo \"{}\"", Self::escape_str(&path)))
|
||||
.await?;
|
||||
.await?
|
||||
.into_hashmaps(&["file", "directory", "playlist"]);
|
||||
|
||||
let props = Self::split_properties(result.properties, &["file", "directory", "playlist"]);
|
||||
|
||||
let files = props
|
||||
let files = result
|
||||
.iter()
|
||||
.flat_map(|prop| {
|
||||
if let Some(file) = prop.get("file") {
|
||||
|
@ -292,11 +289,11 @@ impl Mpd {
|
|||
}
|
||||
|
||||
pub async fn playlist(&mut self) -> anyhow::Result<Vec<QueueItem>> {
|
||||
let status = self.command("status").await?.as_hashmap();
|
||||
let status = self.command("status").await?.into_hashmap();
|
||||
let current_songid = status.get("songid");
|
||||
|
||||
let playlistinfo = self.command("playlistinfo").await?;
|
||||
let queue = Self::split_properties(playlistinfo.properties, &["file"]);
|
||||
let queue = playlistinfo.into_hashmaps(&["file"]);
|
||||
|
||||
let queue = queue
|
||||
.iter()
|
||||
|
|
Loading…
Reference in a new issue