commands: split response tokenizer into separate file

This commit is contained in:
2025-11-24 19:16:09 +09:00
parent 062dbcafb8
commit 7b27a650a1
135 changed files with 687 additions and 839 deletions

View File

@@ -1,6 +1,4 @@
use std::collections::{HashMap, HashSet};
use crate::{Request, request_tokenizer::RequestTokenizer};
use crate::{Request, request_tokenizer::RequestTokenizer, response_tokenizer::ResponseAttributes};
mod audio_output_devices;
mod client_to_client;
@@ -69,11 +67,9 @@ pub trait Command {
Self::parse_request(tokenized).map(|(req, _)| (req, rest))
}
fn parse_response(
parts: ResponseAttributes<'_>,
) -> Result<Self::Response, ResponseParserError<'_>>;
fn parse_response(parts: ResponseAttributes<'_>) -> ResponseParserResult<'_, Self::Response>;
fn parse_raw_response(raw: &str) -> Result<Self::Response, ResponseParserError<'_>> {
fn parse_raw_response(raw: &str) -> ResponseParserResult<'_, Self::Response> {
Self::parse_response(ResponseAttributes::new(raw)?)
}
}
@@ -90,6 +86,8 @@ pub enum RequestParserError {
MissingNewline,
}
pub type ResponseParserResult<'a, T> = Result<T, ResponseParserError<'a>>;
// TODO: should these be renamed to fit the mpd docs?
// "Attribute" instead of "Property"?
#[derive(Debug, Clone, PartialEq)]
@@ -115,265 +113,6 @@ pub enum ResponseParserError<'a> {
// MissingNewline,
}
pub type GenericResponseResult<'a> = Result<GenericResponse<'a>, &'a str>;
pub type GenericResponse<'a> = HashMap<&'a str, GenericResponseValue<'a>>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum GenericResponseValue<'a> {
Text(&'a str),
Binary(&'a [u8]),
// Many(Vec<GenericResponseValue<'a>>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct ResponseAttributes<'a>(Vec<(&'a str, GenericResponseValue<'a>)>);
impl<'a> ResponseAttributes<'a> {
pub fn new(raw: &'a str) -> Result<Self, ResponseParserError<'a>> {
let mut parts = Vec::new();
let mut lines = raw.lines();
loop {
let line = lines.next().ok_or(ResponseParserError::UnexpectedEOF)?;
if line.is_empty() {
println!("Warning: empty line in response");
continue;
}
if line == "OK" {
break;
}
let mut keyval = line.splitn(2, ": ");
let key = keyval
.next()
.ok_or(ResponseParserError::SyntaxError(0, line))?;
// TODO: handle binary data, also verify binarylimit
let value = keyval
.next()
.ok_or(ResponseParserError::SyntaxError(0, line))?;
parts.push((key, GenericResponseValue::Text(value)));
}
Ok(parts.into())
}
// pub fn get<'a>(&self, key: &str) -> Option<&GenericResponseValue<'a>> {
// self.0.iter().find_map(|(k, v)| if k == &key { Some(v) } else { None })
// }
}
impl ResponseAttributes<'_> {
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
impl<'a> From<HashMap<&'a str, GenericResponseValue<'a>>> for ResponseAttributes<'a> {
fn from(map: HashMap<&'a str, GenericResponseValue<'a>>) -> Self {
Self(map.into_iter().collect())
}
}
impl<'a> From<ResponseAttributes<'a>> for HashMap<&'a str, GenericResponseValue<'a>> {
fn from(val: ResponseAttributes<'a>) -> Self {
debug_assert!({
let mut uniq = HashSet::new();
val.0.iter().all(move |x| uniq.insert(*x))
});
val.0.into_iter().collect()
}
}
impl<'a> From<ResponseAttributes<'a>> for Vec<(&'a str, GenericResponseValue<'a>)> {
fn from(val: ResponseAttributes<'a>) -> Self {
val.0
}
}
impl<'a> From<Vec<(&'a str, GenericResponseValue<'a>)>> for ResponseAttributes<'a> {
fn from(val: Vec<(&'a str, GenericResponseValue<'a>)>) -> Self {
Self(val)
}
}
// TODO: There should probably be a helper that lets you extract and verify one, two or maybe
// three properties without having to allocate a hashmap to get a nice API. We can retrieve
// the properties by name with a loop on the inner vec.
/*******************/
/* Parsing Helpers */
/*******************/
macro_rules! _expect_property_type {
($property:expr, $name:expr, $variant:ident) => {
match $property {
Some(crate::commands::GenericResponseValue::$variant(value)) => Some(value),
Some(value) => {
let actual_type = match value {
crate::commands::GenericResponseValue::Text(_) => "Text",
crate::commands::GenericResponseValue::Binary(_) => "Binary",
};
return Err(
crate::commands::ResponseParserError::UnexpectedPropertyType(
$name,
actual_type,
),
);
}
None => None,
}
};
}
macro_rules! _parse_optional_property_type {
($name:expr, $property:expr) => {
$property
.map(|value| {
value.parse().map_err(|_| {
crate::commands::ResponseParserError::InvalidProperty($name, value)
})
})
.transpose()?
};
}
macro_rules! _unwrap_optional_property_type {
($name:expr, $property:expr) => {
match $property {
Some(value) => value,
None => return Err(crate::commands::ResponseParserError::MissingProperty($name)),
}
};
}
macro_rules! expect_optional_property_type {
($property:expr, $name:expr, $variant:ident) => {
crate::commands::_expect_property_type!($property, $name, $variant)
};
}
macro_rules! expect_property_type {
($property:expr, $name:expr, $variant:ident) => {{
let prop = crate::commands::_expect_property_type!($property, $name, $variant);
crate::commands::_unwrap_optional_property_type!($name, prop)
}};
}
macro_rules! get_optional_property {
($parts:expr, $name:literal, $variant:ident) => {
crate::commands::_expect_property_type!({ $parts.get($name).map(|v| *v) }, $name, $variant)
};
}
macro_rules! get_property {
($parts:expr, $name:literal, $variant:ident) => {{
let prop = crate::commands::_expect_property_type!(
{ $parts.get($name).map(|v| *v) },
$name,
$variant
);
crate::commands::_unwrap_optional_property_type!($name, prop)
}};
}
macro_rules! get_and_parse_optional_property {
($parts:ident, $name:literal, $variant:ident) => {{
let prop = crate::commands::_expect_property_type!(
{ $parts.get($name).map(|v| *v) },
$name,
$variant
);
crate::commands::_parse_optional_property_type!($name, prop)
}};
}
macro_rules! get_and_parse_property {
($parts:ident, $name:literal, $variant:ident) => {{
let prop = crate::commands::_expect_property_type!(
{ $parts.get($name).map(|v| *v) },
$name,
$variant
);
let prop = crate::commands::_parse_optional_property_type!($name, prop);
crate::commands::_unwrap_optional_property_type!($name, prop)
}};
}
macro_rules! get_next_optional_property {
($parts:ident, $variant:ident) => {
match $parts.next() {
Some((name, value)) => {
crate::commands::_expect_property_type!({ Some(value) }, name, $variant)
.map(|value| (name, value))
}
None => None,
}
};
}
macro_rules! get_next_property {
($parts:ident, $variant:ident) => {
match $parts.next() {
Some((name, value)) => (
name,
crate::commands::_expect_property_type!({ Some(value) }, name, $variant).unwrap(),
),
None => return Err(crate::commands::ResponseParserError::UnexpectedEOF),
}
};
}
macro_rules! get_next_and_parse_optional_property {
($parts:ident, $variant:ident) => {
match $parts.next() {
Some((name, value)) => {
let prop = crate::commands::_expect_property_type!({ Some(value) }, name, $variant);
prop.map(|value| {
(
name,
crate::commands::_parse_optional_property_type!(name, value),
)
})
}
None => None,
}
};
}
macro_rules! get_next_and_parse_property {
($parts:ident, $variant:ident) => {
match $parts.next() {
Some((name, value)) => {
let prop = crate::commands::_expect_property_type!({ Some(value) }, name, $variant);
let prop = crate::commands::_parse_optional_property_type!(name, prop);
(
name,
crate::commands::_unwrap_optional_property_type!(name, prop),
)
}
None => return Err(crate::commands::ResponseParserError::UnexpectedEOF),
}
};
}
pub(crate) use _expect_property_type;
pub(crate) use _parse_optional_property_type;
pub(crate) use _unwrap_optional_property_type;
pub(crate) use expect_property_type;
// pub(crate) use expect_optional_property_type;
pub(crate) use get_and_parse_optional_property;
pub(crate) use get_and_parse_property;
// pub(crate) use get_next_and_parse_optional_property;
pub(crate) use get_next_and_parse_property;
// pub(crate) use get_next_optional_property;
pub(crate) use get_next_property;
pub(crate) use get_optional_property;
pub(crate) use get_property;
/*******************/
pub const COMMAND_NAMES: &[&str] = &[
@@ -522,39 +261,3 @@ pub const COMMAND_NAMES: &[&str] = &[
Save::COMMAND,
SearchPlaylist::COMMAND,
];
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[cfg(debug_assertions)]
fn test_valid_hashmap_uniqueness_assert() {
let valid_maplike_attrs: ResponseAttributes = vec![
("a", GenericResponseValue::Text("1")),
("A", GenericResponseValue::Text("2")),
("A ", GenericResponseValue::Text("3")),
("b", GenericResponseValue::Text("4")),
]
.into();
let map: HashMap<_, _> = valid_maplike_attrs.into();
assert_eq!(map.len(), 4);
}
#[test]
#[cfg(debug_assertions)]
#[should_panic]
fn test_invalid_hashmap_uniqueness_assert() {
let invalid_maplike_attrs: ResponseAttributes = vec![
("a", GenericResponseValue::Text("1")),
("b", GenericResponseValue::Text("2")),
("c", GenericResponseValue::Text("3")),
("a", GenericResponseValue::Text("4")),
]
.into();
let map: HashMap<_, _> = invalid_maplike_attrs.into();
assert_eq!(map.len(), 4);
}
}

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::AudioOutputId,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct DisableOutput;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::AudioOutputId,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct EnableOutput;

View File

@@ -3,11 +3,9 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
expect_property_type,
},
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct Outputs;
@@ -38,7 +36,7 @@ impl Command for Outputs {
}
fn parse_response(
_parts: ResponseAttributes<'_>,
parts: ResponseAttributes<'_>,
) -> Result<Self::Response, ResponseParserError<'_>> {
let mut outputs = Vec::new();
@@ -48,7 +46,7 @@ impl Command for Outputs {
let mut enabled: Option<bool> = None;
let mut attributes: HashMap<String, String> = HashMap::new();
for (k, v) in _parts.0.into_iter() {
for (k, v) in Vec::from(parts).into_iter() {
match k {
"outputid" => {
// Reset and store the previous output if all fields are present

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::AudioOutputId,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct OutputSet;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::AudioOutputId,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ToggleOutput;

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
expect_property_type,
},
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::ChannelName,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct Channels;

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
expect_property_type,
},
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::ChannelName,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct ReadMessages;

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::ChannelName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct SendMessage;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::ChannelName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Subscribe;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::ChannelName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Unsubscribe;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct BinaryLimit;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Close;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Kill;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct Password;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Ping;

View File

@@ -1,9 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserResult, ResponseAttributes, ResponseParserError, expect_property_type,
},
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct Protocol;
@@ -27,12 +26,12 @@ impl Command for Protocol {
fn parse_response(
parts: ResponseAttributes<'_>,
) -> Result<Self::Response, ResponseParserError<'_>> {
if let Some((k, _)) = parts.0.iter().find(|(k, _)| *k != "feature") {
let parts_: Vec<_> = parts.into();
if let Some((k, _)) = parts_.iter().find(|(k, _)| *k != "feature") {
return Err(ResponseParserError::UnexpectedProperty(k));
}
let list = parts
.0
let list = parts_
.into_iter()
.map(|(k, v)| Ok(expect_property_type!(Some(v), k, Text).to_string()))
.collect::<Result<Vec<_>, ResponseParserError>>()?;

View File

@@ -1,7 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct ProtocolAll;

View File

@@ -1,9 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserResult, ResponseAttributes, ResponseParserError, expect_property_type,
},
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct ProtocolAvailable;
@@ -27,12 +26,12 @@ impl Command for ProtocolAvailable {
fn parse_response(
parts: ResponseAttributes<'_>,
) -> Result<Self::Response, ResponseParserError<'_>> {
if let Some((k, _)) = parts.0.iter().find(|(k, _)| *k != "feature") {
let parts_: Vec<_> = parts.into();
if let Some((k, _)) = parts_.iter().find(|(k, _)| *k != "feature") {
return Err(ResponseParserError::UnexpectedProperty(k));
}
let list = parts
.0
let list = parts_
.into_iter()
.map(|(k, v)| Ok(expect_property_type!(Some(v), k, Text).to_string()))
.collect::<Result<Vec<_>, ResponseParserError>>()?;

View File

@@ -1,7 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct ProtocolClear;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::Feature,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ProtocolDisable;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::Feature,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ProtocolEnable;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
expect_property_type,
},
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct TagTypes;

View File

@@ -1,7 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct TagTypesAll;

View File

@@ -1,9 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserResult, ResponseAttributes, ResponseParserError, expect_property_type,
},
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct TagTypesAvailable;

View File

@@ -1,7 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct TagTypesClear;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::TagName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct TagTypesDisable;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::TagName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct TagTypesEnable;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::TagName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct TagTypesReset;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Next;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct Pause;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::SongPosition,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Play;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::SongId,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PlayId;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Previous;

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{SongPosition, TimeWithFractions},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Seek;

View File

@@ -1,12 +1,12 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
common::{SeekMode, TimeWithFractions},
request_tokenizer::RequestTokenizer,
};
pub struct SeekCur;

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{SongId, TimeWithFractions},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct SeekId;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Stop;

View File

@@ -1,9 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserResult, ResponseAttributes, ResponseParserError, expect_property_type,
},
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct ListMounts;

View File

@@ -2,10 +2,9 @@ use std::collections::HashMap;
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserResult, ResponseAttributes, ResponseParserError, expect_property_type,
},
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct ListNeighbors;

View File

@@ -2,10 +2,9 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct Mount;

View File

@@ -1,9 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct Unmount;

View File

@@ -3,12 +3,10 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, get_and_parse_property, get_property,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{Offset, Uri},
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_and_parse_property, get_property},
};
pub struct AlbumArt;

View File

@@ -3,13 +3,11 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, get_and_parse_property,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::GroupType,
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_and_parse_property},
};
pub struct Count;

View File

@@ -1,13 +1,11 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{Sort, WindowRange},
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Find;

View File

@@ -1,13 +1,11 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{SongPosition, Sort, WindowRange},
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct FindAdd;

View File

@@ -3,12 +3,10 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, get_and_parse_property,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_and_parse_property},
};
pub struct GetFingerprint;

View File

@@ -1,13 +1,11 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, expect_property_type,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{GroupType, TagName},
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct List;
@@ -67,13 +65,13 @@ impl Command for List {
fn parse_response(
parts: ResponseAttributes<'_>,
) -> Result<Self::Response, ResponseParserError<'_>> {
let parts_: Vec<_> = parts.into();
debug_assert!({
let key = parts.0.first().map(|(k, _)| k);
parts.0.iter().all(|(k, _)| k == key.unwrap())
let key = parts_.first().map(|(k, _)| k);
parts_.iter().all(|(k, _)| k == key.unwrap())
});
let list = parts
.0
let list = parts_
.into_iter()
.map(|(k, v)| Ok(expect_property_type!(Some(v), k, Text).to_string()))
.collect::<Result<Vec<_>, ResponseParserError>>()?;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ListAll;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ListAllInfo;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ListFiles;

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, expect_property_type,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct LsInfo;

View File

@@ -1,12 +1,10 @@
use std::collections::HashMap;
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, GenericResponseValue, Request, RequestParserError, RequestParserResult,
ResponseAttributes, ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::{GenericResponseValue, ResponseAttributes},
};
pub struct ReadComments;

View File

@@ -3,12 +3,12 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, get_and_parse_property, get_optional_property, get_property,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{Offset, Uri},
request_tokenizer::RequestTokenizer,
response_tokenizer::{
ResponseAttributes, get_and_parse_property, get_optional_property, get_property,
},
};
pub struct ReadPicture;

View File

@@ -3,12 +3,10 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
get_and_parse_property,
},
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_and_parse_property},
};
pub struct Rescan;

View File

@@ -1,13 +1,11 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{Sort, WindowRange},
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Search;

View File

@@ -1,13 +1,13 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
common::{SongPosition, Sort, WindowRange},
filter::Filter,
request_tokenizer::RequestTokenizer,
};
pub struct SearchAdd;

View File

@@ -1,13 +1,13 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
common::{PlaylistName, SongPosition, Sort, WindowRange},
filter::Filter,
request_tokenizer::RequestTokenizer,
};
pub struct SearchAddPl;

View File

@@ -3,13 +3,11 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, get_and_parse_property,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::GroupType,
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_and_parse_property},
};
pub struct SearchCount;

View File

@@ -3,12 +3,10 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
get_and_parse_property,
},
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::Uri,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_and_parse_property},
};
pub struct Update;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::PartitionName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct DelPartition;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
expect_property_type,
},
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::PartitionName,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, expect_property_type},
};
pub struct ListPartitions;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct MoveOutput;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::PartitionName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct NewPartition;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::PartitionName,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Partition;

View File

@@ -1,12 +1,10 @@
use std::str::FromStr;
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::BoolOrOneshot,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Consume;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Seconds,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Crossfade;

View File

@@ -1,12 +1,10 @@
use std::collections::HashMap;
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
get_and_parse_property,
},
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::VolumeValue,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_and_parse_property},
};
pub struct GetVol;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct MixRampDb;

View File

@@ -1,10 +1,8 @@
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::Seconds,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct MixRampDelay;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct Random;

View File

@@ -1,9 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
response_tokenizer::ResponseAttributes,
};
pub struct Repeat;

View File

@@ -1,12 +1,10 @@
use std::str::FromStr;
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::ReplayGainModeMode,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ReplayGainMode;

View File

@@ -3,12 +3,10 @@ use std::{collections::HashMap, str::FromStr};
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
get_property,
},
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::ReplayGainModeMode,
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_property},
};
pub struct ReplayGainStatus;

View File

@@ -1,12 +1,10 @@
use std::str::FromStr;
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::VolumeValue,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct SetVol;

View File

@@ -1,12 +1,10 @@
use std::str::FromStr;
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::BoolOrOneshot,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Single;

View File

@@ -1,12 +1,10 @@
use std::str::FromStr;
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::VolumeValue,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Volume;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
/// Clears the current error message in status (this is also accomplished by any command that starts playback)

View File

@@ -1,8 +1,9 @@
use serde::{Deserialize, Serialize};
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
/// Displays the song info of the current song (same song that is identified in status)

View File

@@ -1,10 +1,10 @@
use std::str::FromStr;
use crate::request_tokenizer::RequestTokenizer;
use crate::common::SubSystem;
use crate::commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::SubSystem,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Idle;

View File

@@ -3,10 +3,10 @@ use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError,
get_and_parse_optional_property, get_and_parse_property,
response_tokenizer::{
ResponseAttributes, get_and_parse_optional_property, get_and_parse_property,
},
};

View File

@@ -3,13 +3,14 @@ use std::str::FromStr;
use serde::{Deserialize, Serialize};
use crate::request_tokenizer::RequestTokenizer;
use crate::common::{Audio, BoolOrOneshot, SongId, SongPosition};
use crate::commands::{
Command, GenericResponseValue, Request, RequestParserResult, ResponseAttributes,
ResponseParserError, get_and_parse_optional_property, get_and_parse_property,
get_optional_property, get_property,
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
common::{Audio, BoolOrOneshot, SongId, SongPosition},
request_tokenizer::RequestTokenizer,
response_tokenizer::{
GenericResponseValue, ResponseAttributes, get_and_parse_optional_property,
get_and_parse_property, get_optional_property, get_property,
},
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{SongPosition, Uri},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Add;

View File

@@ -1,12 +1,10 @@
use serde::{Deserialize, Serialize};
use crate::{
request_tokenizer::RequestTokenizer,
commands::{
Command, Request, RequestParserError, RequestParserResult, ResponseAttributes,
ResponseParserError, get_next_and_parse_property,
},
commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError},
common::{SongId, SongPosition, Uri},
request_tokenizer::RequestTokenizer,
response_tokenizer::{ResponseAttributes, get_next_and_parse_property},
};
pub struct AddId;

View File

@@ -2,11 +2,11 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
common::{SongId, TagName, TagValue},
request_tokenizer::RequestTokenizer,
};
pub struct AddTagId;

View File

@@ -1,6 +1,7 @@
use crate::{
commands::{Command, Request, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Clear;

View File

@@ -2,11 +2,10 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::{SongId, TagName},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct ClearTagId;

View File

@@ -2,11 +2,10 @@ use std::str::FromStr;
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::OneOrRange,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Delete;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::SongId,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct DeleteId;

View File

@@ -2,11 +2,11 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
common::{AbsouluteRelativeSongPosition, OneOrRange},
request_tokenizer::RequestTokenizer,
};
pub struct Move;

View File

@@ -2,11 +2,11 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
common::{AbsouluteRelativeSongPosition, SongId},
request_tokenizer::RequestTokenizer,
};
pub struct MoveId;

View File

@@ -1,7 +1,8 @@
use crate::{
Request,
commands::{Command, RequestParserResult, ResponseParserError},
request_tokenizer::RequestTokenizer,
commands::{Command, RequestParserResult, ResponseAttributes, ResponseParserError},
response_tokenizer::ResponseAttributes,
};
pub struct Playlist;

View File

@@ -2,12 +2,11 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::{Sort, WindowRange},
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PlaylistFind;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::SongId,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PlaylistId;

View File

@@ -1,10 +1,9 @@
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::OneOrRange,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PlaylistInfo;

View File

@@ -2,12 +2,11 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::{Sort, WindowRange},
filter::Filter,
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PlaylistSearch;

View File

@@ -2,11 +2,10 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::{Version, WindowRange},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PlChanges;

View File

@@ -2,11 +2,10 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::{Version, WindowRange},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PlChangesPosId;

View File

@@ -2,11 +2,10 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::{Priority, WindowRange},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct Prio;

View File

@@ -2,11 +2,10 @@ use serde::{Deserialize, Serialize};
use crate::{
Request,
request_tokenizer::RequestTokenizer,
commands::{
Command, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError,
},
commands::{Command, RequestParserError, RequestParserResult, ResponseParserError},
common::{Priority, SongId},
request_tokenizer::RequestTokenizer,
response_tokenizer::ResponseAttributes,
};
pub struct PrioId;

Some files were not shown because too many files have changed in this diff Show More