Compare commits
2 Commits
deduplicat
...
db-selecti
Author | SHA1 | Date | |
---|---|---|---|
f674b0b0b1
|
|||
493995c1f2
|
30
Cargo.lock
generated
30
Cargo.lock
generated
@@ -1,6 +1,6 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 4
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "diff"
|
name = "diff"
|
||||||
@@ -19,9 +19,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indoc"
|
name = "indoc"
|
||||||
version = "2.0.6"
|
version = "2.0.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
|
checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pretty_assertions"
|
name = "pretty_assertions"
|
||||||
@@ -35,36 +35,36 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.95"
|
version = "1.0.88"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
|
checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.40"
|
version = "1.0.37"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
|
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.219"
|
version = "1.0.210"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
|
checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.219"
|
version = "1.0.210"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
|
checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -73,9 +73,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.101"
|
version = "2.0.82"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
|
checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -84,9 +84,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.18"
|
version = "1.0.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yansi"
|
name = "yansi"
|
||||||
|
@@ -7,8 +7,8 @@ authors = [
|
|||||||
description = "A rust implementation of the mpd protocol, both client and serverside"
|
description = "A rust implementation of the mpd protocol, both client and serverside"
|
||||||
repository = "https://git.pvv.ntnu.no/Grzegorz/empidee"
|
repository = "https://git.pvv.ntnu.no/Grzegorz/empidee"
|
||||||
documentation = "https://pages.pvv.ntnu.no/Grzegorz/empidee/main/docs/empidee/"
|
documentation = "https://pages.pvv.ntnu.no/Grzegorz/empidee/main/docs/empidee/"
|
||||||
edition = "2024"
|
edition = "2021"
|
||||||
rust-version = "1.85.0"
|
rust-version = "1.83.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = { version = "1.0.210", features = ["derive"] }
|
serde = { version = "1.0.210", features = ["derive"] }
|
||||||
|
12
flake.lock
generated
12
flake.lock
generated
@@ -2,11 +2,11 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1746461020,
|
"lastModified": 1739866667,
|
||||||
"narHash": "sha256-7+pG1I9jvxNlmln4YgnlW4o+w0TZX24k688mibiFDUE=",
|
"narHash": "sha256-EO1ygNKZlsAC9avfcwHkKGMsmipUk1Uc0TbrEZpkn64=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "3730d8a308f94996a9ba7c7138ede69c1b9ac4ae",
|
"rev": "73cf49b8ad837ade2de76f87eb53fc85ed5d4680",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -29,11 +29,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1746585402,
|
"lastModified": 1740277845,
|
||||||
"narHash": "sha256-Pf+ufu6bYNA1+KQKHnGMNEfTwpD9ZIcAeLoE2yPWIP0=",
|
"narHash": "sha256-NNU0CdiaSbAeZ8tpDG4aFi9qtcdlItRvk8Xns9oBrVU=",
|
||||||
"owner": "oxalica",
|
"owner": "oxalica",
|
||||||
"repo": "rust-overlay",
|
"repo": "rust-overlay",
|
||||||
"rev": "72dd969389583664f87aa348b3458f2813693617",
|
"rev": "f933070c29f9c1c5457447a51903f27f76ebb519",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
style_edition = "2024"
|
|
@@ -1,8 +1,8 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
expect_property_type, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Channels;
|
pub struct Channels;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
expect_property_type, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ReadMessages;
|
pub struct ReadMessages;
|
||||||
@@ -34,12 +34,8 @@ impl Command for ReadMessages {
|
|||||||
let (ckey, cvalue) = channel_message_pair[0];
|
let (ckey, cvalue) = channel_message_pair[0];
|
||||||
let (mkey, mvalue) = channel_message_pair[1];
|
let (mkey, mvalue) = channel_message_pair[1];
|
||||||
|
|
||||||
if ckey != "channel" {
|
debug_assert!(ckey == "channel");
|
||||||
return Err(ResponseParserError::UnexpectedProperty(ckey));
|
debug_assert!(mkey == "message");
|
||||||
}
|
|
||||||
if mkey != "message" {
|
|
||||||
return Err(ResponseParserError::UnexpectedProperty(mkey));
|
|
||||||
}
|
|
||||||
|
|
||||||
let channel = expect_property_type!(Some(cvalue), "channel", Text).to_string();
|
let channel = expect_property_type!(Some(cvalue), "channel", Text).to_string();
|
||||||
let message = expect_property_type!(Some(mvalue), "message", Text).to_string();
|
let message = expect_property_type!(Some(mvalue), "message", Text).to_string();
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Protocol;
|
pub struct Protocol;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ProtocolAll;
|
pub struct ProtocolAll;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ProtocolAvailable;
|
pub struct ProtocolAvailable;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ProtocolClear;
|
pub struct ProtocolClear;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ProtocolDisable;
|
pub struct ProtocolDisable;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ProtocolEnable;
|
pub struct ProtocolEnable;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TagTypes;
|
pub struct TagTypes;
|
||||||
@@ -24,7 +24,16 @@ impl Command for TagTypes {
|
|||||||
let mut tagtypes = Vec::with_capacity(parts.len());
|
let mut tagtypes = Vec::with_capacity(parts.len());
|
||||||
for (key, value) in parts.into_iter() {
|
for (key, value) in parts.into_iter() {
|
||||||
debug_assert_eq!(key, "tagtype");
|
debug_assert_eq!(key, "tagtype");
|
||||||
let tagtype = expect_property_type!(Some(value), "tagtype", Text).to_string();
|
|
||||||
|
let tagtype = match value {
|
||||||
|
GenericResponseValue::Text(name) => name.to_string(),
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(
|
||||||
|
"tagtype", "Binary",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
tagtypes.push(tagtype);
|
tagtypes.push(tagtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TagTypesAll;
|
pub struct TagTypesAll;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TagTypesAvailable;
|
pub struct TagTypesAvailable;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TagTypesClear;
|
pub struct TagTypesClear;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TagTypesDisable;
|
pub struct TagTypesDisable;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TagTypesEnable;
|
pub struct TagTypesEnable;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TagTypesReset;
|
pub struct TagTypesReset;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ListMounts;
|
pub struct ListMounts;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ListNeighbors;
|
pub struct ListNeighbors;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Mount;
|
pub struct Mount;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Unmount;
|
pub struct Unmount;
|
||||||
|
@@ -2,8 +2,8 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_and_parse_property, get_property, Command, Request, RequestParserError,
|
||||||
ResponseParserError, get_and_parse_property, get_property,
|
RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
common::Offset,
|
common::Offset,
|
||||||
};
|
};
|
||||||
|
@@ -2,8 +2,8 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_and_parse_property, Command, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, get_and_parse_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
filter::parse_filter,
|
filter::parse_filter,
|
||||||
};
|
};
|
||||||
|
@@ -46,6 +46,7 @@ impl Command for Find {
|
|||||||
fn parse_response(
|
fn parse_response(
|
||||||
parts: ResponseAttributes<'_>,
|
parts: ResponseAttributes<'_>,
|
||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
|
// db_selection_print
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_and_parse_property, Command, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, get_and_parse_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct GetFingerprint;
|
pub struct GetFingerprint;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
expect_property_type, Command, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, expect_property_type,
|
ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
filter::parse_filter,
|
filter::parse_filter,
|
||||||
};
|
};
|
||||||
|
@@ -2,12 +2,11 @@ use crate::commands::{
|
|||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
||||||
ResponseParserError,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
use crate::common::DbSelectionPrintResponse;
|
||||||
|
|
||||||
pub struct ListAllInfo;
|
pub struct ListAllInfo;
|
||||||
|
|
||||||
// TODO: This is supposed to be a tree-like structure, with directories containing files and playlists
|
pub type ListAllInfoResponse = Vec<DbSelectionPrintResponse>;
|
||||||
// in addition to the metadata of each entry
|
|
||||||
pub type ListAllInfoResponse = Vec<String>;
|
|
||||||
|
|
||||||
impl Command for ListAllInfo {
|
impl Command for ListAllInfo {
|
||||||
type Response = ListAllInfoResponse;
|
type Response = ListAllInfoResponse;
|
||||||
@@ -30,6 +29,6 @@ impl Command for ListAllInfo {
|
|||||||
fn parse_response(
|
fn parse_response(
|
||||||
parts: ResponseAttributes<'_>,
|
parts: ResponseAttributes<'_>,
|
||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
unimplemented!()
|
DbSelectionPrintResponse::parse(parts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,7 @@ impl Command for ListFiles {
|
|||||||
fn parse_response(
|
fn parse_response(
|
||||||
parts: ResponseAttributes<'_>,
|
parts: ResponseAttributes<'_>,
|
||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
|
// db_selection_print
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,7 @@ impl Command for LsInfo {
|
|||||||
fn parse_response(
|
fn parse_response(
|
||||||
parts: ResponseAttributes<'_>,
|
parts: ResponseAttributes<'_>,
|
||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
|
// db_selection_print
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,7 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, GenericResponseValue, Request, RequestParserError, RequestParserResult,
|
Command, GenericResponseValue, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseAttributes, ResponseParserError, expect_property_type,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ReadComments;
|
pub struct ReadComments;
|
||||||
@@ -30,12 +30,10 @@ impl Command for ReadComments {
|
|||||||
let parts: HashMap<_, _> = parts.into();
|
let parts: HashMap<_, _> = parts.into();
|
||||||
|
|
||||||
let comments = parts
|
let comments = parts
|
||||||
.into_iter()
|
.iter()
|
||||||
.map(|(k, v)| {
|
.map(|(k, v)| match v {
|
||||||
Ok((
|
GenericResponseValue::Text(s) => Ok((k.to_string(), s.to_string())),
|
||||||
k.to_string(),
|
GenericResponseValue::Binary(_) => Err(ResponseParserError::SyntaxError(1, k)),
|
||||||
expect_property_type!(Some(v), k, Text).to_string(),
|
|
||||||
))
|
|
||||||
})
|
})
|
||||||
.collect::<Result<HashMap<_, _>, ResponseParserError>>()?;
|
.collect::<Result<HashMap<_, _>, ResponseParserError>>()?;
|
||||||
|
|
||||||
|
@@ -2,8 +2,8 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_and_parse_property, get_optional_property, get_property, Command, Request,
|
||||||
ResponseParserError, get_and_parse_property, get_optional_property, get_property,
|
RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
common::Offset,
|
common::Offset,
|
||||||
};
|
};
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
get_and_parse_property, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
get_and_parse_property,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Rescan;
|
pub struct Rescan;
|
||||||
|
@@ -46,6 +46,7 @@ impl Command for Search {
|
|||||||
fn parse_response(
|
fn parse_response(
|
||||||
parts: ResponseAttributes<'_>,
|
parts: ResponseAttributes<'_>,
|
||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
|
// db_selection_print
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,8 +2,8 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_and_parse_property, Command, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, get_and_parse_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
filter::parse_filter,
|
filter::parse_filter,
|
||||||
};
|
};
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
get_and_parse_property, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
get_and_parse_property,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Update;
|
pub struct Update;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
expect_property_type, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ListPartitions;
|
pub struct ListPartitions;
|
||||||
|
@@ -2,8 +2,8 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
get_and_parse_property, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
get_and_parse_property,
|
ResponseParserError,
|
||||||
},
|
},
|
||||||
common::VolumeValue,
|
common::VolumeValue,
|
||||||
};
|
};
|
||||||
|
@@ -4,8 +4,8 @@ use serde::{Deserialize, Serialize};
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
get_property, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
get_property,
|
ResponseParserError,
|
||||||
},
|
},
|
||||||
common::ReplayGainModeMode,
|
common::ReplayGainModeMode,
|
||||||
};
|
};
|
||||||
|
@@ -3,8 +3,8 @@ use std::collections::HashMap;
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
get_and_parse_optional_property, get_and_parse_property, Command, Request, RequestParserResult,
|
||||||
get_and_parse_optional_property, get_and_parse_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Stats;
|
pub struct Stats;
|
||||||
|
@@ -6,9 +6,9 @@ use serde::{Deserialize, Serialize};
|
|||||||
use crate::common::{Audio, BoolOrOneshot, SongId, SongPosition};
|
use crate::common::{Audio, BoolOrOneshot, SongId, SongPosition};
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
|
get_and_parse_optional_property, get_and_parse_property, get_optional_property, get_property,
|
||||||
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
|
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
|
||||||
ResponseParserError, get_and_parse_optional_property, get_and_parse_property,
|
ResponseParserError,
|
||||||
get_optional_property, get_property,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_next_and_parse_property, Command, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, get_next_and_parse_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
common::{SongId, SongPosition},
|
common::{SongId, SongPosition},
|
||||||
};
|
};
|
||||||
@@ -40,15 +40,8 @@ impl Command for AddId {
|
|||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
let parts: Vec<_> = parts.into();
|
let parts: Vec<_> = parts.into();
|
||||||
let mut iter = parts.into_iter();
|
let mut iter = parts.into_iter();
|
||||||
|
|
||||||
let (key, id) = get_next_and_parse_property!(iter, Text);
|
let (key, id) = get_next_and_parse_property!(iter, Text);
|
||||||
|
debug_assert!(key == "Id");
|
||||||
if key != "Id" {
|
|
||||||
return Err(ResponseParserError::UnexpectedProperty(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
debug_assert!(iter.next().is_none());
|
|
||||||
|
|
||||||
Ok(AddIdResponse { id })
|
Ok(AddIdResponse { id })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct AddTagId;
|
pub struct AddTagId;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ClearTagId;
|
pub struct ClearTagId;
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
common::OneOrRange,
|
common::OneOrRange,
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Delete;
|
pub struct Delete;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct DeleteId;
|
pub struct DeleteId;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Move;
|
pub struct Move;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct MoveId;
|
pub struct MoveId;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Playlist;
|
pub struct Playlist;
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
filter::parse_filter,
|
filter::parse_filter,
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PlaylistFind;
|
pub struct PlaylistFind;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PlaylistId;
|
pub struct PlaylistId;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PlaylistInfo;
|
pub struct PlaylistInfo;
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
filter::parse_filter,
|
filter::parse_filter,
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PlaylistSearch;
|
pub struct PlaylistSearch;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PlChanges;
|
pub struct PlChanges;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PlChangesPosId;
|
pub struct PlChangesPosId;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Prio;
|
pub struct Prio;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PrioId;
|
pub struct PrioId;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct RangeId;
|
pub struct RangeId;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Shuffle;
|
pub struct Shuffle;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Swap;
|
pub struct Swap;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Request,
|
|
||||||
commands::{
|
commands::{
|
||||||
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
|
Request,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct SwapId;
|
pub struct SwapId;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Commands;
|
pub struct Commands;
|
||||||
@@ -25,7 +25,14 @@ impl Command for Commands {
|
|||||||
if key != "command" {
|
if key != "command" {
|
||||||
return Err(ResponseParserError::UnexpectedProperty(key));
|
return Err(ResponseParserError::UnexpectedProperty(key));
|
||||||
}
|
}
|
||||||
let value = expect_property_type!(Some(value), "command", Text);
|
let value = match value {
|
||||||
|
GenericResponseValue::Text(value) => value,
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(
|
||||||
|
"handler", "Binary",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
result.push(value.to_string());
|
result.push(value.to_string());
|
||||||
}
|
}
|
||||||
Ok(result)
|
Ok(result)
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
get_and_parse_property, get_property, Command, Request, RequestParserResult,
|
||||||
get_and_parse_property, get_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct Config;
|
pub struct Config;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct NotCommands;
|
pub struct NotCommands;
|
||||||
@@ -25,7 +25,14 @@ impl Command for NotCommands {
|
|||||||
if key != "command" {
|
if key != "command" {
|
||||||
return Err(ResponseParserError::UnexpectedProperty(key));
|
return Err(ResponseParserError::UnexpectedProperty(key));
|
||||||
}
|
}
|
||||||
let value = expect_property_type!(Some(value), "command", Text).to_string();
|
let value = match value {
|
||||||
|
GenericResponseValue::Text(value) => value,
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(
|
||||||
|
"handler", "Binary",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
result.push(value.to_string());
|
result.push(value.to_string());
|
||||||
}
|
}
|
||||||
Ok(result)
|
Ok(result)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct UrlHandlers;
|
pub struct UrlHandlers;
|
||||||
@@ -25,7 +25,14 @@ impl Command for UrlHandlers {
|
|||||||
if key != "handler" {
|
if key != "handler" {
|
||||||
return Err(ResponseParserError::UnexpectedProperty(key));
|
return Err(ResponseParserError::UnexpectedProperty(key));
|
||||||
}
|
}
|
||||||
let value = expect_property_type!(Some(value), "handler", Text);
|
let value = match value {
|
||||||
|
GenericResponseValue::Text(value) => value,
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(
|
||||||
|
"handler", "Binary",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
url_handlers.push(value.to_string());
|
url_handlers.push(value.to_string());
|
||||||
}
|
}
|
||||||
Ok(url_handlers)
|
Ok(url_handlers)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
Command, GenericResponseValue, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, expect_property_type,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct StickerFind;
|
pub struct StickerFind;
|
||||||
@@ -84,8 +84,21 @@ impl Command for StickerFind {
|
|||||||
// TODO: debug assert that this is a valid sticker type
|
// TODO: debug assert that this is a valid sticker type
|
||||||
// debug_assert!(uri.0 == "");
|
// debug_assert!(uri.0 == "");
|
||||||
|
|
||||||
let uri = expect_property_type!(Some(uri.1), uri.0, Text).to_string();
|
let uri = match uri.1 {
|
||||||
let sticker = expect_property_type!(Some(sticker.1), sticker.0, Text);
|
GenericResponseValue::Text(s) => s.to_string(),
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(uri.0, "Binary"))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let sticker = match sticker.1 {
|
||||||
|
GenericResponseValue::Text(s) => s,
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(
|
||||||
|
"sticker", "Binary",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// TODO: This assumes the first = is the only one.
|
// TODO: This assumes the first = is the only one.
|
||||||
// See: https://github.com/MusicPlayerDaemon/MPD/issues/2166
|
// See: https://github.com/MusicPlayerDaemon/MPD/issues/2166
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_next_property, Command, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, get_next_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct StickerGet;
|
pub struct StickerGet;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
Command, GenericResponseValue, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, expect_property_type,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct StickerList;
|
pub struct StickerList;
|
||||||
@@ -37,7 +37,12 @@ impl Command for StickerList {
|
|||||||
|
|
||||||
let result = parts
|
let result = parts
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(k, v)| Ok(expect_property_type!(Some(v), k, Text)))
|
.map(|(_, v)| match v {
|
||||||
|
GenericResponseValue::Text(value) => Ok(value),
|
||||||
|
GenericResponseValue::Binary(_) => Err(
|
||||||
|
ResponseParserError::UnexpectedPropertyType("sticker", "Binary"),
|
||||||
|
),
|
||||||
|
})
|
||||||
.collect::<Result<Vec<_>, ResponseParserError>>()?;
|
.collect::<Result<Vec<_>, ResponseParserError>>()?;
|
||||||
|
|
||||||
result
|
result
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
expect_property_type, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct StickerNames;
|
pub struct StickerNames;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct StickerNamesTypes;
|
pub struct StickerNamesTypes;
|
||||||
@@ -34,8 +34,23 @@ impl Command for StickerNamesTypes {
|
|||||||
debug_assert!(name_key == "name");
|
debug_assert!(name_key == "name");
|
||||||
debug_assert!(type_key == "type");
|
debug_assert!(type_key == "type");
|
||||||
|
|
||||||
let name = expect_property_type!(Some(name_value), name_key, Text).to_string();
|
let name = match name_value {
|
||||||
let sticker_type = expect_property_type!(Some(type_value), type_key, Text).to_string();
|
GenericResponseValue::Text(s) => s.to_string(),
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(
|
||||||
|
"name", "Binary",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let sticker_type = match type_value {
|
||||||
|
GenericResponseValue::Text(s) => s.to_string(),
|
||||||
|
GenericResponseValue::Binary(_) => {
|
||||||
|
return Err(ResponseParserError::UnexpectedPropertyType(
|
||||||
|
"type", "Binary",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
result
|
result
|
||||||
.entry(name)
|
.entry(name)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
|
expect_property_type, Command, Request, RequestParserResult, ResponseAttributes,
|
||||||
expect_property_type,
|
ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct StickerTypes;
|
pub struct StickerTypes;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
commands::{
|
commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
Command, GenericResponseValue, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, expect_property_type,
|
ResponseAttributes, ResponseParserError,
|
||||||
},
|
},
|
||||||
common::PlaylistName,
|
common::PlaylistName,
|
||||||
};
|
};
|
||||||
@@ -37,12 +37,17 @@ impl Command for ListPlaylist {
|
|||||||
parts: ResponseAttributes<'_>,
|
parts: ResponseAttributes<'_>,
|
||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
let parts: Vec<_> = parts.into();
|
let parts: Vec<_> = parts.into();
|
||||||
|
|
||||||
debug_assert!(parts.iter().all(|(k, _)| *k == "file"));
|
|
||||||
|
|
||||||
parts
|
parts
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(name, value)| Ok(expect_property_type!(Some(value), name, Text).to_string()))
|
.map(|(name, value)| {
|
||||||
|
debug_assert_eq!(name, "file");
|
||||||
|
match value {
|
||||||
|
GenericResponseValue::Text(value) => Ok(value.to_string()),
|
||||||
|
GenericResponseValue::Binary(_) => Err(
|
||||||
|
ResponseParserError::UnexpectedPropertyType("file", "Binary"),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
})
|
||||||
.collect::<Result<Vec<_>, _>>()
|
.collect::<Result<Vec<_>, _>>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,8 @@ impl Command for ListPlaylists {
|
|||||||
fn parse_response(
|
fn parse_response(
|
||||||
parts: ResponseAttributes<'_>,
|
parts: ResponseAttributes<'_>,
|
||||||
) -> Result<Self::Response, ResponseParserError> {
|
) -> Result<Self::Response, ResponseParserError> {
|
||||||
|
// playlist: string
|
||||||
|
// Last-Modified: mtime?
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
|
get_and_parse_property, Command, Request, RequestParserError, RequestParserResult,
|
||||||
ResponseParserError, get_and_parse_property,
|
ResponseAttributes, ResponseParserError,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct PlaylistLength;
|
pub struct PlaylistLength;
|
||||||
|
@@ -1,6 +1,10 @@
|
|||||||
mod absolute_relative_song_position;
|
mod absolute_relative_song_position;
|
||||||
mod audio;
|
mod audio;
|
||||||
mod bool_or_oneshot;
|
mod bool_or_oneshot;
|
||||||
|
mod db_directory_info;
|
||||||
|
mod db_playlist_info;
|
||||||
|
mod db_selection_print;
|
||||||
|
mod db_song_info;
|
||||||
mod group_type;
|
mod group_type;
|
||||||
mod one_or_range;
|
mod one_or_range;
|
||||||
mod replay_gain_mode_mode;
|
mod replay_gain_mode_mode;
|
||||||
@@ -15,6 +19,10 @@ mod window_range;
|
|||||||
pub use absolute_relative_song_position::AbsouluteRelativeSongPosition;
|
pub use absolute_relative_song_position::AbsouluteRelativeSongPosition;
|
||||||
pub use audio::Audio;
|
pub use audio::Audio;
|
||||||
pub use bool_or_oneshot::BoolOrOneshot;
|
pub use bool_or_oneshot::BoolOrOneshot;
|
||||||
|
pub use db_directory_info::DbDirectoryInfo;
|
||||||
|
pub use db_playlist_info::DbPlaylistInfo;
|
||||||
|
pub use db_selection_print::DbSelectionPrintResponse;
|
||||||
|
pub use db_song_info::DbSongInfo;
|
||||||
pub use group_type::GroupType;
|
pub use group_type::GroupType;
|
||||||
pub use one_or_range::OneOrRange;
|
pub use one_or_range::OneOrRange;
|
||||||
pub use replay_gain_mode_mode::ReplayGainModeMode;
|
pub use replay_gain_mode_mode::ReplayGainModeMode;
|
||||||
|
30
src/common/types/db_directory_info.rs
Normal file
30
src/common/types/db_directory_info.rs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::commands::{
|
||||||
|
get_optional_property, get_property, ResponseAttributes, ResponseParserError,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::Path;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct DbDirectoryInfo {
|
||||||
|
pub directory: Path,
|
||||||
|
// TODO: parse this
|
||||||
|
pub last_modified: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DbDirectoryInfo {
|
||||||
|
pub fn parse(parts: ResponseAttributes<'_>) -> Result<Self, ResponseParserError<'_>> {
|
||||||
|
let parts: HashMap<_, _> = parts.into();
|
||||||
|
|
||||||
|
let directory = get_property!(parts, "directory", Text).to_owned();
|
||||||
|
let last_modified =
|
||||||
|
get_optional_property!(parts, "Last-Modified", Text).map(|s| s.to_owned());
|
||||||
|
Ok(DbDirectoryInfo {
|
||||||
|
directory,
|
||||||
|
last_modified,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
31
src/common/types/db_playlist_info.rs
Normal file
31
src/common/types/db_playlist_info.rs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::commands::{
|
||||||
|
get_optional_property, get_property, ResponseAttributes, ResponseParserError,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::PlaylistName;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct DbPlaylistInfo {
|
||||||
|
pub playlist: PlaylistName,
|
||||||
|
// TODO: parse this
|
||||||
|
pub last_modified: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DbPlaylistInfo {
|
||||||
|
pub fn parse(parts: ResponseAttributes<'_>) -> Result<Self, ResponseParserError<'_>> {
|
||||||
|
let parts: HashMap<_, _> = parts.into();
|
||||||
|
|
||||||
|
let playlist = get_property!(parts, "playlist", Text).to_owned();
|
||||||
|
let last_modified =
|
||||||
|
get_optional_property!(parts, "Last-Modified", Text).map(|s| s.to_owned());
|
||||||
|
|
||||||
|
Ok(DbPlaylistInfo {
|
||||||
|
playlist,
|
||||||
|
last_modified,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
86
src/common/types/db_selection_print.rs
Normal file
86
src/common/types/db_selection_print.rs
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::commands::{ResponseAttributes, ResponseParserError};
|
||||||
|
|
||||||
|
use super::{DbDirectoryInfo, DbPlaylistInfo, DbSongInfo};
|
||||||
|
|
||||||
|
// TODO: transform to a tree structure?
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub enum DbSelectionPrintResponse {
|
||||||
|
Directory(DbDirectoryInfo),
|
||||||
|
Song(DbSongInfo),
|
||||||
|
Playlist(DbPlaylistInfo),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DbSelectionPrintResponse {
|
||||||
|
pub fn parse(
|
||||||
|
parts: ResponseAttributes<'_>,
|
||||||
|
) -> Result<Vec<DbSelectionPrintResponse>, ResponseParserError> {
|
||||||
|
debug_assert!(!parts.is_empty());
|
||||||
|
let vec: Vec<_> = parts.into();
|
||||||
|
|
||||||
|
vec.into_iter()
|
||||||
|
.fold(Vec::new(), |mut acc, (key, value)| {
|
||||||
|
if ["directory", "file", "playlist"].contains(&key) {
|
||||||
|
acc.push((key, HashMap::new()));
|
||||||
|
}
|
||||||
|
let result = acc.last_mut().unwrap().1.insert(key, value);
|
||||||
|
debug_assert_eq!(result, None);
|
||||||
|
acc
|
||||||
|
})
|
||||||
|
.into_iter()
|
||||||
|
.map(|(key, attrs)| match key {
|
||||||
|
"directory" => DbDirectoryInfo::parse(attrs.into())
|
||||||
|
.map(DbSelectionPrintResponse::Directory),
|
||||||
|
"file" => {
|
||||||
|
DbSongInfo::parse(attrs.into()).map(DbSelectionPrintResponse::Song)
|
||||||
|
}
|
||||||
|
"playlist" => DbPlaylistInfo::parse(attrs.into())
|
||||||
|
.map(DbSelectionPrintResponse::Playlist),
|
||||||
|
p => Err(ResponseParserError::UnexpectedProperty(p)),
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<DbSelectionPrintResponse>, ResponseParserError<'_>>>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use crate::commands::*;
|
||||||
|
|
||||||
|
const INPUT: &str = r#"
|
||||||
|
directory: Albums
|
||||||
|
Last-Modified: 2023-05-15T17:25:12Z
|
||||||
|
directory: Albums/Name - Album
|
||||||
|
Last-Modified: 2022-12-31T17:40:04Z
|
||||||
|
file: Albums/Artist - Title.mp3
|
||||||
|
Last-Modified: 2022-12-31T02:43:04Z
|
||||||
|
Added: 2025-01-18T18:44:26Z
|
||||||
|
Format: 44100:16:2
|
||||||
|
Title: Title
|
||||||
|
Artist: Artist
|
||||||
|
Album: Album
|
||||||
|
AlbumArtist: Artist
|
||||||
|
Composer: Composer
|
||||||
|
Genre: Pop, Rock
|
||||||
|
Track: 1
|
||||||
|
Disc: 1
|
||||||
|
Date: 2022-04-27
|
||||||
|
Time: 341
|
||||||
|
duration: 341.463
|
||||||
|
playlist: Playlists/Playlist
|
||||||
|
Last-Modified: 2021-10-31T13:57:44Z
|
||||||
|
playlist: Playlists/Playlist 2
|
||||||
|
OK
|
||||||
|
"#;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_db_selection_print_response() {
|
||||||
|
let parts = ResponseAttributes::new(INPUT.trim()).unwrap();
|
||||||
|
let result = DbSelectionPrintResponse::parse(parts);
|
||||||
|
assert!(result.is_ok());
|
||||||
|
}
|
||||||
|
}
|
68
src/common/types/db_song_info.rs
Normal file
68
src/common/types/db_song_info.rs
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::commands::{expect_property_type, ResponseAttributes, ResponseParserError};
|
||||||
|
|
||||||
|
use super::{Path, PlaylistName, Seconds, Tag, TimeInterval};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct DbSongInfo {
|
||||||
|
pub file: Path,
|
||||||
|
pub range: Option<TimeInterval>,
|
||||||
|
// TODO: parse this
|
||||||
|
pub last_modified: Option<String>,
|
||||||
|
// TODO: parse this
|
||||||
|
pub added: Option<String>,
|
||||||
|
pub format: Option<String>,
|
||||||
|
pub tags: Vec<Tag>,
|
||||||
|
pub time: Option<Seconds>,
|
||||||
|
pub duration: Option<f64>,
|
||||||
|
pub playlist: Option<PlaylistName>,
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! remove_and_parse_next_optional_property {
|
||||||
|
($parts:ident, $name:literal, $variant:ident) => {{
|
||||||
|
let prop =
|
||||||
|
crate::commands::_expect_property_type!({ $parts.remove($name) }, $name, $variant);
|
||||||
|
crate::commands::_parse_optional_property_type!($name, prop)
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DbSongInfo {
|
||||||
|
pub fn parse(parts: ResponseAttributes<'_>) -> Result<Self, ResponseParserError<'_>> {
|
||||||
|
let mut parts: HashMap<_, _> = parts.into();
|
||||||
|
let file: Path = match remove_and_parse_next_optional_property!(parts, "file", Text) {
|
||||||
|
Some(f) => f,
|
||||||
|
None => return Err(ResponseParserError::MissingProperty("file")),
|
||||||
|
};
|
||||||
|
|
||||||
|
let range = remove_and_parse_next_optional_property!(parts, "Range", Text);
|
||||||
|
let last_modified = remove_and_parse_next_optional_property!(parts, "Last-Modified", Text);
|
||||||
|
let added = remove_and_parse_next_optional_property!(parts, "Added", Text);
|
||||||
|
let format = remove_and_parse_next_optional_property!(parts, "Format", Text);
|
||||||
|
let time = remove_and_parse_next_optional_property!(parts, "Time", Text);
|
||||||
|
let duration = remove_and_parse_next_optional_property!(parts, "Duration", Text);
|
||||||
|
let playlist = remove_and_parse_next_optional_property!(parts, "Playlist", Text);
|
||||||
|
|
||||||
|
let tags = parts
|
||||||
|
.into_iter()
|
||||||
|
.map(|(key, value)| {
|
||||||
|
let value = expect_property_type!(Some(value), key, Text).to_string();
|
||||||
|
Ok(Tag::new(key.to_string(), value))
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<Tag>, ResponseParserError<'_>>>()?;
|
||||||
|
|
||||||
|
Ok(DbSongInfo {
|
||||||
|
file,
|
||||||
|
range,
|
||||||
|
last_modified,
|
||||||
|
added,
|
||||||
|
format,
|
||||||
|
tags,
|
||||||
|
time,
|
||||||
|
duration,
|
||||||
|
playlist,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@@ -239,7 +239,7 @@ impl Request {
|
|||||||
.ok_or(RequestParserError::MissingCommandListEnd(i))?;
|
.ok_or(RequestParserError::MissingCommandListEnd(i))?;
|
||||||
match line.trim() {
|
match line.trim() {
|
||||||
"command_list_begin" => {
|
"command_list_begin" => {
|
||||||
return Err(RequestParserError::NestedCommandList(i));
|
return Err(RequestParserError::NestedCommandList(i))
|
||||||
}
|
}
|
||||||
"command_list_end" => {
|
"command_list_end" => {
|
||||||
return Ok((Request::CommandList(commands), rest));
|
return Ok((Request::CommandList(commands), rest));
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
use crate::{Request, Response, common::SubSystem};
|
use crate::{common::SubSystem, Request, Response};
|
||||||
|
|
||||||
pub trait MPDServer {
|
pub trait MPDServer {
|
||||||
type Error;
|
type Error;
|
||||||
|
Reference in New Issue
Block a user