From bbd0e7186142f001af6cedec85e09b6884b29ecc Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 24 Nov 2025 19:16:09 +0900 Subject: [PATCH] commands: split response tokenizer into separate file --- src/commands.rs | 307 +---------------- .../audio_output_devices/disableoutput.rs | 8 +- .../audio_output_devices/enableoutput.rs | 8 +- src/commands/audio_output_devices/outputs.rs | 10 +- .../audio_output_devices/outputset.rs | 8 +- .../audio_output_devices/toggleoutput.rs | 8 +- src/commands/client_to_client/channels.rs | 8 +- src/commands/client_to_client/readmessages.rs | 8 +- src/commands/client_to_client/sendmessage.rs | 8 +- src/commands/client_to_client/subscribe.rs | 8 +- src/commands/client_to_client/unsubscribe.rs | 8 +- .../connection_settings/binary_limit.rs | 6 +- src/commands/connection_settings/close.rs | 3 +- src/commands/connection_settings/kill.rs | 3 +- src/commands/connection_settings/password.rs | 6 +- src/commands/connection_settings/ping.rs | 3 +- src/commands/connection_settings/protocol.rs | 11 +- .../connection_settings/protocol_all.rs | 3 +- .../connection_settings/protocol_available.rs | 11 +- .../connection_settings/protocol_clear.rs | 3 +- .../connection_settings/protocol_disable.rs | 7 +- .../connection_settings/protocol_enable.rs | 7 +- src/commands/connection_settings/tag_types.rs | 6 +- .../connection_settings/tag_types_all.rs | 3 +- .../tag_types_available.rs | 5 +- .../connection_settings/tag_types_clear.rs | 3 +- .../connection_settings/tag_types_disable.rs | 7 +- .../connection_settings/tag_types_enable.rs | 7 +- .../connection_settings/tag_types_reset.rs | 7 +- src/commands/controlling_playback/next.rs | 3 +- src/commands/controlling_playback/pause.rs | 6 +- src/commands/controlling_playback/play.rs | 8 +- src/commands/controlling_playback/playid.rs | 8 +- src/commands/controlling_playback/previous.rs | 3 +- src/commands/controlling_playback/seek.rs | 8 +- src/commands/controlling_playback/seekcur.rs | 2 +- src/commands/controlling_playback/seekid.rs | 8 +- src/commands/controlling_playback/stop.rs | 3 +- .../mounts_and_neighbors/listmounts.rs | 5 +- .../mounts_and_neighbors/listneighbors.rs | 5 +- src/commands/mounts_and_neighbors/mount.rs | 5 +- src/commands/mounts_and_neighbors/unmount.rs | 5 +- src/commands/music_database/albumart.rs | 8 +- src/commands/music_database/count.rs | 8 +- src/commands/music_database/find.rs | 8 +- src/commands/music_database/findadd.rs | 8 +- src/commands/music_database/getfingerprint.rs | 8 +- src/commands/music_database/list.rs | 16 +- src/commands/music_database/listall.rs | 8 +- src/commands/music_database/listallinfo.rs | 8 +- src/commands/music_database/listfiles.rs | 8 +- src/commands/music_database/lsinfo.rs | 8 +- src/commands/music_database/readcomments.rs | 8 +- src/commands/music_database/readpicture.rs | 10 +- src/commands/music_database/rescan.rs | 8 +- src/commands/music_database/search.rs | 8 +- src/commands/music_database/searchadd.rs | 2 +- src/commands/music_database/searchaddpl.rs | 2 +- src/commands/music_database/searchcount.rs | 8 +- src/commands/music_database/update.rs | 8 +- .../partition_commands/delpartition.rs | 8 +- .../partition_commands/listpartitions.rs | 8 +- src/commands/partition_commands/moveoutput.rs | 6 +- .../partition_commands/newpartition.rs | 8 +- src/commands/partition_commands/partition.rs | 8 +- src/commands/playback_options/consume.rs | 8 +- src/commands/playback_options/crossfade.rs | 8 +- src/commands/playback_options/getvol.rs | 8 +- src/commands/playback_options/mixrampdb.rs | 6 +- src/commands/playback_options/mixrampdelay.rs | 8 +- src/commands/playback_options/random.rs | 6 +- src/commands/playback_options/repeat.rs | 6 +- .../playback_options/replay_gain_mode.rs | 8 +- .../playback_options/replay_gain_status.rs | 8 +- src/commands/playback_options/setvol.rs | 8 +- src/commands/playback_options/single.rs | 8 +- src/commands/playback_options/volume.rs | 8 +- .../querying_mpd_status/clearerror.rs | 3 +- .../querying_mpd_status/currentsong.rs | 3 +- src/commands/querying_mpd_status/idle.rs | 10 +- src/commands/querying_mpd_status/stats.rs | 6 +- src/commands/querying_mpd_status/status.rs | 15 +- src/commands/queue/add.rs | 8 +- src/commands/queue/addid.rs | 8 +- src/commands/queue/addtagid.rs | 2 +- src/commands/queue/clear.rs | 3 +- src/commands/queue/cleartagid.rs | 7 +- src/commands/queue/delete.rs | 7 +- src/commands/queue/deleteid.rs | 7 +- src/commands/queue/move_.rs | 2 +- src/commands/queue/moveid.rs | 2 +- src/commands/queue/playlist.rs | 3 +- src/commands/queue/playlistfind.rs | 7 +- src/commands/queue/playlistid.rs | 7 +- src/commands/queue/playlistinfo.rs | 7 +- src/commands/queue/playlistsearch.rs | 7 +- src/commands/queue/plchanges.rs | 7 +- src/commands/queue/plchangesposid.rs | 7 +- src/commands/queue/prio.rs | 7 +- src/commands/queue/prioid.rs | 7 +- src/commands/queue/rangeid.rs | 7 +- src/commands/queue/shuffle.rs | 7 +- src/commands/queue/swap.rs | 7 +- src/commands/queue/swapid.rs | 7 +- src/commands/reflection/commands.rs | 6 +- src/commands/reflection/config.rs | 6 +- src/commands/reflection/decoders.rs | 8 +- src/commands/reflection/not_commands.rs | 6 +- src/commands/reflection/url_handlers.rs | 6 +- src/commands/stickers/sticker_dec.rs | 8 +- src/commands/stickers/sticker_delete.rs | 8 +- src/commands/stickers/sticker_find.rs | 8 +- src/commands/stickers/sticker_get.rs | 8 +- src/commands/stickers/sticker_inc.rs | 8 +- src/commands/stickers/sticker_list.rs | 8 +- src/commands/stickers/sticker_set.rs | 2 +- src/commands/stickers/stickernames.rs | 12 +- src/commands/stickers/stickernamestypes.rs | 8 +- src/commands/stickers/stickertypes.rs | 12 +- src/commands/stored_playlists/listplaylist.rs | 8 +- .../stored_playlists/listplaylistinfo.rs | 8 +- .../stored_playlists/listplaylists.rs | 3 +- src/commands/stored_playlists/load.rs | 8 +- src/commands/stored_playlists/playlistadd.rs | 8 +- .../stored_playlists/playlistclear.rs | 8 +- .../stored_playlists/playlistdelete.rs | 8 +- .../stored_playlists/playlistlength.rs | 8 +- src/commands/stored_playlists/playlistmove.rs | 8 +- src/commands/stored_playlists/rename.rs | 6 +- src/commands/stored_playlists/rm.rs | 8 +- src/commands/stored_playlists/save.rs | 8 +- .../stored_playlists/searchplaylist.rs | 8 +- src/lib.rs | 3 +- src/request.rs | 2 +- src/response_tokenizer.rs | 311 ++++++++++++++++++ 135 files changed, 687 insertions(+), 839 deletions(-) create mode 100644 src/response_tokenizer.rs diff --git a/src/commands.rs b/src/commands.rs index 4e45553..b37e4ee 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -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>; + fn parse_response(parts: ResponseAttributes<'_>) -> ResponseParserResult<'_, Self::Response>; - fn parse_raw_response(raw: &str) -> Result> { + 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>; + // 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, &'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>), -} - -#[derive(Debug, Clone, PartialEq)] -pub struct ResponseAttributes<'a>(Vec<(&'a str, GenericResponseValue<'a>)>); - -impl<'a> ResponseAttributes<'a> { - pub fn new(raw: &'a str) -> Result> { - 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>> for ResponseAttributes<'a> { - fn from(map: HashMap<&'a str, GenericResponseValue<'a>>) -> Self { - Self(map.into_iter().collect()) - } -} - -impl<'a> From> 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> for Vec<(&'a str, GenericResponseValue<'a>)> { - fn from(val: ResponseAttributes<'a>) -> Self { - val.0 - } -} - -impl<'a> From)>> 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); - } -} diff --git a/src/commands/audio_output_devices/disableoutput.rs b/src/commands/audio_output_devices/disableoutput.rs index 7f0de09..e86c236 100644 --- a/src/commands/audio_output_devices/disableoutput.rs +++ b/src/commands/audio_output_devices/disableoutput.rs @@ -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; diff --git a/src/commands/audio_output_devices/enableoutput.rs b/src/commands/audio_output_devices/enableoutput.rs index 361c6bf..403f5d5 100644 --- a/src/commands/audio_output_devices/enableoutput.rs +++ b/src/commands/audio_output_devices/enableoutput.rs @@ -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; diff --git a/src/commands/audio_output_devices/outputs.rs b/src/commands/audio_output_devices/outputs.rs index bc9d875..efe9caf 100644 --- a/src/commands/audio_output_devices/outputs.rs +++ b/src/commands/audio_output_devices/outputs.rs @@ -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> { let mut outputs = Vec::new(); @@ -48,7 +46,7 @@ impl Command for Outputs { let mut enabled: Option = None; let mut attributes: HashMap = 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 diff --git a/src/commands/audio_output_devices/outputset.rs b/src/commands/audio_output_devices/outputset.rs index f83aed9..e7b1a25 100644 --- a/src/commands/audio_output_devices/outputset.rs +++ b/src/commands/audio_output_devices/outputset.rs @@ -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; diff --git a/src/commands/audio_output_devices/toggleoutput.rs b/src/commands/audio_output_devices/toggleoutput.rs index 5d8dfc7..89f4ed4 100644 --- a/src/commands/audio_output_devices/toggleoutput.rs +++ b/src/commands/audio_output_devices/toggleoutput.rs @@ -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; diff --git a/src/commands/client_to_client/channels.rs b/src/commands/client_to_client/channels.rs index 68c1612..396947d 100644 --- a/src/commands/client_to_client/channels.rs +++ b/src/commands/client_to_client/channels.rs @@ -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; diff --git a/src/commands/client_to_client/readmessages.rs b/src/commands/client_to_client/readmessages.rs index e26fd0a..c255562 100644 --- a/src/commands/client_to_client/readmessages.rs +++ b/src/commands/client_to_client/readmessages.rs @@ -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; diff --git a/src/commands/client_to_client/sendmessage.rs b/src/commands/client_to_client/sendmessage.rs index 61b1fff..dc9b1eb 100644 --- a/src/commands/client_to_client/sendmessage.rs +++ b/src/commands/client_to_client/sendmessage.rs @@ -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; diff --git a/src/commands/client_to_client/subscribe.rs b/src/commands/client_to_client/subscribe.rs index caf1f6d..c054be5 100644 --- a/src/commands/client_to_client/subscribe.rs +++ b/src/commands/client_to_client/subscribe.rs @@ -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; diff --git a/src/commands/client_to_client/unsubscribe.rs b/src/commands/client_to_client/unsubscribe.rs index 71a5be2..bb7b475 100644 --- a/src/commands/client_to_client/unsubscribe.rs +++ b/src/commands/client_to_client/unsubscribe.rs @@ -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; diff --git a/src/commands/connection_settings/binary_limit.rs b/src/commands/connection_settings/binary_limit.rs index 399a6de..075094c 100644 --- a/src/commands/connection_settings/binary_limit.rs +++ b/src/commands/connection_settings/binary_limit.rs @@ -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; diff --git a/src/commands/connection_settings/close.rs b/src/commands/connection_settings/close.rs index 0a0a222..640296f 100644 --- a/src/commands/connection_settings/close.rs +++ b/src/commands/connection_settings/close.rs @@ -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; diff --git a/src/commands/connection_settings/kill.rs b/src/commands/connection_settings/kill.rs index cecb1f7..534a55a 100644 --- a/src/commands/connection_settings/kill.rs +++ b/src/commands/connection_settings/kill.rs @@ -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; diff --git a/src/commands/connection_settings/password.rs b/src/commands/connection_settings/password.rs index 0dea258..919c442 100644 --- a/src/commands/connection_settings/password.rs +++ b/src/commands/connection_settings/password.rs @@ -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; diff --git a/src/commands/connection_settings/ping.rs b/src/commands/connection_settings/ping.rs index 88e04f7..79074cd 100644 --- a/src/commands/connection_settings/ping.rs +++ b/src/commands/connection_settings/ping.rs @@ -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; diff --git a/src/commands/connection_settings/protocol.rs b/src/commands/connection_settings/protocol.rs index 8e0155d..f5bd572 100644 --- a/src/commands/connection_settings/protocol.rs +++ b/src/commands/connection_settings/protocol.rs @@ -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> { - 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::, ResponseParserError>>()?; diff --git a/src/commands/connection_settings/protocol_all.rs b/src/commands/connection_settings/protocol_all.rs index 54978b0..ea54689 100644 --- a/src/commands/connection_settings/protocol_all.rs +++ b/src/commands/connection_settings/protocol_all.rs @@ -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; diff --git a/src/commands/connection_settings/protocol_available.rs b/src/commands/connection_settings/protocol_available.rs index feefcf7..5036b7b 100644 --- a/src/commands/connection_settings/protocol_available.rs +++ b/src/commands/connection_settings/protocol_available.rs @@ -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> { - 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::, ResponseParserError>>()?; diff --git a/src/commands/connection_settings/protocol_clear.rs b/src/commands/connection_settings/protocol_clear.rs index 0f18ce3..9bb8077 100644 --- a/src/commands/connection_settings/protocol_clear.rs +++ b/src/commands/connection_settings/protocol_clear.rs @@ -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; diff --git a/src/commands/connection_settings/protocol_disable.rs b/src/commands/connection_settings/protocol_disable.rs index 6a4bfb8..9d335fc 100644 --- a/src/commands/connection_settings/protocol_disable.rs +++ b/src/commands/connection_settings/protocol_disable.rs @@ -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; diff --git a/src/commands/connection_settings/protocol_enable.rs b/src/commands/connection_settings/protocol_enable.rs index 961bb42..1419caa 100644 --- a/src/commands/connection_settings/protocol_enable.rs +++ b/src/commands/connection_settings/protocol_enable.rs @@ -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; diff --git a/src/commands/connection_settings/tag_types.rs b/src/commands/connection_settings/tag_types.rs index ee82801..5ab6589 100644 --- a/src/commands/connection_settings/tag_types.rs +++ b/src/commands/connection_settings/tag_types.rs @@ -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; diff --git a/src/commands/connection_settings/tag_types_all.rs b/src/commands/connection_settings/tag_types_all.rs index ab636df..1e48a2f 100644 --- a/src/commands/connection_settings/tag_types_all.rs +++ b/src/commands/connection_settings/tag_types_all.rs @@ -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; diff --git a/src/commands/connection_settings/tag_types_available.rs b/src/commands/connection_settings/tag_types_available.rs index 58da073..d995345 100644 --- a/src/commands/connection_settings/tag_types_available.rs +++ b/src/commands/connection_settings/tag_types_available.rs @@ -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; diff --git a/src/commands/connection_settings/tag_types_clear.rs b/src/commands/connection_settings/tag_types_clear.rs index 4741b71..39f516d 100644 --- a/src/commands/connection_settings/tag_types_clear.rs +++ b/src/commands/connection_settings/tag_types_clear.rs @@ -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; diff --git a/src/commands/connection_settings/tag_types_disable.rs b/src/commands/connection_settings/tag_types_disable.rs index 24ee777..0d64000 100644 --- a/src/commands/connection_settings/tag_types_disable.rs +++ b/src/commands/connection_settings/tag_types_disable.rs @@ -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; diff --git a/src/commands/connection_settings/tag_types_enable.rs b/src/commands/connection_settings/tag_types_enable.rs index d5a1133..72e6136 100644 --- a/src/commands/connection_settings/tag_types_enable.rs +++ b/src/commands/connection_settings/tag_types_enable.rs @@ -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; diff --git a/src/commands/connection_settings/tag_types_reset.rs b/src/commands/connection_settings/tag_types_reset.rs index 33a39f3..c750849 100644 --- a/src/commands/connection_settings/tag_types_reset.rs +++ b/src/commands/connection_settings/tag_types_reset.rs @@ -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; diff --git a/src/commands/controlling_playback/next.rs b/src/commands/controlling_playback/next.rs index eeae993..451b6b1 100644 --- a/src/commands/controlling_playback/next.rs +++ b/src/commands/controlling_playback/next.rs @@ -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; diff --git a/src/commands/controlling_playback/pause.rs b/src/commands/controlling_playback/pause.rs index 79da4ac..490579e 100644 --- a/src/commands/controlling_playback/pause.rs +++ b/src/commands/controlling_playback/pause.rs @@ -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; diff --git a/src/commands/controlling_playback/play.rs b/src/commands/controlling_playback/play.rs index 82a0407..bd4697f 100644 --- a/src/commands/controlling_playback/play.rs +++ b/src/commands/controlling_playback/play.rs @@ -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; diff --git a/src/commands/controlling_playback/playid.rs b/src/commands/controlling_playback/playid.rs index dbe908c..06615f0 100644 --- a/src/commands/controlling_playback/playid.rs +++ b/src/commands/controlling_playback/playid.rs @@ -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; diff --git a/src/commands/controlling_playback/previous.rs b/src/commands/controlling_playback/previous.rs index 9958ee1..f13a310 100644 --- a/src/commands/controlling_playback/previous.rs +++ b/src/commands/controlling_playback/previous.rs @@ -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; diff --git a/src/commands/controlling_playback/seek.rs b/src/commands/controlling_playback/seek.rs index e5966b4..0b4d3b5 100644 --- a/src/commands/controlling_playback/seek.rs +++ b/src/commands/controlling_playback/seek.rs @@ -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; diff --git a/src/commands/controlling_playback/seekcur.rs b/src/commands/controlling_playback/seekcur.rs index b2fa2ea..243c7a3 100644 --- a/src/commands/controlling_playback/seekcur.rs +++ b/src/commands/controlling_playback/seekcur.rs @@ -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; diff --git a/src/commands/controlling_playback/seekid.rs b/src/commands/controlling_playback/seekid.rs index 1fe3eb0..32f290d 100644 --- a/src/commands/controlling_playback/seekid.rs +++ b/src/commands/controlling_playback/seekid.rs @@ -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; diff --git a/src/commands/controlling_playback/stop.rs b/src/commands/controlling_playback/stop.rs index 1ecf637..ec65d00 100644 --- a/src/commands/controlling_playback/stop.rs +++ b/src/commands/controlling_playback/stop.rs @@ -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; diff --git a/src/commands/mounts_and_neighbors/listmounts.rs b/src/commands/mounts_and_neighbors/listmounts.rs index 4848d39..bc5fa38 100644 --- a/src/commands/mounts_and_neighbors/listmounts.rs +++ b/src/commands/mounts_and_neighbors/listmounts.rs @@ -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; diff --git a/src/commands/mounts_and_neighbors/listneighbors.rs b/src/commands/mounts_and_neighbors/listneighbors.rs index 544243e..b6b74b4 100644 --- a/src/commands/mounts_and_neighbors/listneighbors.rs +++ b/src/commands/mounts_and_neighbors/listneighbors.rs @@ -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; diff --git a/src/commands/mounts_and_neighbors/mount.rs b/src/commands/mounts_and_neighbors/mount.rs index e502462..2dcb77d 100644 --- a/src/commands/mounts_and_neighbors/mount.rs +++ b/src/commands/mounts_and_neighbors/mount.rs @@ -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; diff --git a/src/commands/mounts_and_neighbors/unmount.rs b/src/commands/mounts_and_neighbors/unmount.rs index 42373de..aad68e0 100644 --- a/src/commands/mounts_and_neighbors/unmount.rs +++ b/src/commands/mounts_and_neighbors/unmount.rs @@ -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; diff --git a/src/commands/music_database/albumart.rs b/src/commands/music_database/albumart.rs index e2835c5..781d9a5 100644 --- a/src/commands/music_database/albumart.rs +++ b/src/commands/music_database/albumart.rs @@ -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; diff --git a/src/commands/music_database/count.rs b/src/commands/music_database/count.rs index 0985dc6..3cd4ea7 100644 --- a/src/commands/music_database/count.rs +++ b/src/commands/music_database/count.rs @@ -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; diff --git a/src/commands/music_database/find.rs b/src/commands/music_database/find.rs index edd9d82..b2ed5c9 100644 --- a/src/commands/music_database/find.rs +++ b/src/commands/music_database/find.rs @@ -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; diff --git a/src/commands/music_database/findadd.rs b/src/commands/music_database/findadd.rs index 4aa8803..5b42ac3 100644 --- a/src/commands/music_database/findadd.rs +++ b/src/commands/music_database/findadd.rs @@ -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; diff --git a/src/commands/music_database/getfingerprint.rs b/src/commands/music_database/getfingerprint.rs index 60d0896..59c2855 100644 --- a/src/commands/music_database/getfingerprint.rs +++ b/src/commands/music_database/getfingerprint.rs @@ -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; diff --git a/src/commands/music_database/list.rs b/src/commands/music_database/list.rs index 80308b0..e843dbb 100644 --- a/src/commands/music_database/list.rs +++ b/src/commands/music_database/list.rs @@ -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> { + 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::, ResponseParserError>>()?; diff --git a/src/commands/music_database/listall.rs b/src/commands/music_database/listall.rs index 69020c5..9ee7a4a 100644 --- a/src/commands/music_database/listall.rs +++ b/src/commands/music_database/listall.rs @@ -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; diff --git a/src/commands/music_database/listallinfo.rs b/src/commands/music_database/listallinfo.rs index f413e93..b966274 100644 --- a/src/commands/music_database/listallinfo.rs +++ b/src/commands/music_database/listallinfo.rs @@ -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; diff --git a/src/commands/music_database/listfiles.rs b/src/commands/music_database/listfiles.rs index 0eed11d..58226ff 100644 --- a/src/commands/music_database/listfiles.rs +++ b/src/commands/music_database/listfiles.rs @@ -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; diff --git a/src/commands/music_database/lsinfo.rs b/src/commands/music_database/lsinfo.rs index 45ffa30..368d60b 100644 --- a/src/commands/music_database/lsinfo.rs +++ b/src/commands/music_database/lsinfo.rs @@ -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; diff --git a/src/commands/music_database/readcomments.rs b/src/commands/music_database/readcomments.rs index 27a8fc9..5570f62 100644 --- a/src/commands/music_database/readcomments.rs +++ b/src/commands/music_database/readcomments.rs @@ -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; diff --git a/src/commands/music_database/readpicture.rs b/src/commands/music_database/readpicture.rs index 90feff6..bedf5b0 100644 --- a/src/commands/music_database/readpicture.rs +++ b/src/commands/music_database/readpicture.rs @@ -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; diff --git a/src/commands/music_database/rescan.rs b/src/commands/music_database/rescan.rs index a686b6e..fa2e95b 100644 --- a/src/commands/music_database/rescan.rs +++ b/src/commands/music_database/rescan.rs @@ -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; diff --git a/src/commands/music_database/search.rs b/src/commands/music_database/search.rs index 0bacf19..0f9e26e 100644 --- a/src/commands/music_database/search.rs +++ b/src/commands/music_database/search.rs @@ -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; diff --git a/src/commands/music_database/searchadd.rs b/src/commands/music_database/searchadd.rs index 995ba67..9efaf0c 100644 --- a/src/commands/music_database/searchadd.rs +++ b/src/commands/music_database/searchadd.rs @@ -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; diff --git a/src/commands/music_database/searchaddpl.rs b/src/commands/music_database/searchaddpl.rs index a864500..a14ac53 100644 --- a/src/commands/music_database/searchaddpl.rs +++ b/src/commands/music_database/searchaddpl.rs @@ -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; diff --git a/src/commands/music_database/searchcount.rs b/src/commands/music_database/searchcount.rs index c3815c2..6bf619b 100644 --- a/src/commands/music_database/searchcount.rs +++ b/src/commands/music_database/searchcount.rs @@ -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; diff --git a/src/commands/music_database/update.rs b/src/commands/music_database/update.rs index dfaa7f3..fee7262 100644 --- a/src/commands/music_database/update.rs +++ b/src/commands/music_database/update.rs @@ -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; diff --git a/src/commands/partition_commands/delpartition.rs b/src/commands/partition_commands/delpartition.rs index 2b3f699..b3152c7 100644 --- a/src/commands/partition_commands/delpartition.rs +++ b/src/commands/partition_commands/delpartition.rs @@ -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; diff --git a/src/commands/partition_commands/listpartitions.rs b/src/commands/partition_commands/listpartitions.rs index 80d04a1..7858d6b 100644 --- a/src/commands/partition_commands/listpartitions.rs +++ b/src/commands/partition_commands/listpartitions.rs @@ -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; diff --git a/src/commands/partition_commands/moveoutput.rs b/src/commands/partition_commands/moveoutput.rs index 0b8ef12..db5f65e 100644 --- a/src/commands/partition_commands/moveoutput.rs +++ b/src/commands/partition_commands/moveoutput.rs @@ -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; diff --git a/src/commands/partition_commands/newpartition.rs b/src/commands/partition_commands/newpartition.rs index 23b7ab0..73c69cf 100644 --- a/src/commands/partition_commands/newpartition.rs +++ b/src/commands/partition_commands/newpartition.rs @@ -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; diff --git a/src/commands/partition_commands/partition.rs b/src/commands/partition_commands/partition.rs index 004e9cc..b5f72ef 100644 --- a/src/commands/partition_commands/partition.rs +++ b/src/commands/partition_commands/partition.rs @@ -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; diff --git a/src/commands/playback_options/consume.rs b/src/commands/playback_options/consume.rs index d3bc1c1..aacd22e 100644 --- a/src/commands/playback_options/consume.rs +++ b/src/commands/playback_options/consume.rs @@ -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; diff --git a/src/commands/playback_options/crossfade.rs b/src/commands/playback_options/crossfade.rs index 0583b87..fa092d7 100644 --- a/src/commands/playback_options/crossfade.rs +++ b/src/commands/playback_options/crossfade.rs @@ -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; diff --git a/src/commands/playback_options/getvol.rs b/src/commands/playback_options/getvol.rs index a6f0c00..bee608a 100644 --- a/src/commands/playback_options/getvol.rs +++ b/src/commands/playback_options/getvol.rs @@ -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; diff --git a/src/commands/playback_options/mixrampdb.rs b/src/commands/playback_options/mixrampdb.rs index 66447a7..354d7fe 100644 --- a/src/commands/playback_options/mixrampdb.rs +++ b/src/commands/playback_options/mixrampdb.rs @@ -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; diff --git a/src/commands/playback_options/mixrampdelay.rs b/src/commands/playback_options/mixrampdelay.rs index 4fb4b78..3922dc7 100644 --- a/src/commands/playback_options/mixrampdelay.rs +++ b/src/commands/playback_options/mixrampdelay.rs @@ -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; diff --git a/src/commands/playback_options/random.rs b/src/commands/playback_options/random.rs index 740f680..2e39867 100644 --- a/src/commands/playback_options/random.rs +++ b/src/commands/playback_options/random.rs @@ -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; diff --git a/src/commands/playback_options/repeat.rs b/src/commands/playback_options/repeat.rs index 62ddcba..641b5e7 100644 --- a/src/commands/playback_options/repeat.rs +++ b/src/commands/playback_options/repeat.rs @@ -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; diff --git a/src/commands/playback_options/replay_gain_mode.rs b/src/commands/playback_options/replay_gain_mode.rs index 8999aa3..6f62659 100644 --- a/src/commands/playback_options/replay_gain_mode.rs +++ b/src/commands/playback_options/replay_gain_mode.rs @@ -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; diff --git a/src/commands/playback_options/replay_gain_status.rs b/src/commands/playback_options/replay_gain_status.rs index 8b4eee9..0641c35 100644 --- a/src/commands/playback_options/replay_gain_status.rs +++ b/src/commands/playback_options/replay_gain_status.rs @@ -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; diff --git a/src/commands/playback_options/setvol.rs b/src/commands/playback_options/setvol.rs index c5af048..4e5d7ba 100644 --- a/src/commands/playback_options/setvol.rs +++ b/src/commands/playback_options/setvol.rs @@ -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; diff --git a/src/commands/playback_options/single.rs b/src/commands/playback_options/single.rs index cfe8a15..f17b1d9 100644 --- a/src/commands/playback_options/single.rs +++ b/src/commands/playback_options/single.rs @@ -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; diff --git a/src/commands/playback_options/volume.rs b/src/commands/playback_options/volume.rs index 1181a07..91570ed 100644 --- a/src/commands/playback_options/volume.rs +++ b/src/commands/playback_options/volume.rs @@ -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; diff --git a/src/commands/querying_mpd_status/clearerror.rs b/src/commands/querying_mpd_status/clearerror.rs index f82f993..c7e4909 100644 --- a/src/commands/querying_mpd_status/clearerror.rs +++ b/src/commands/querying_mpd_status/clearerror.rs @@ -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) diff --git a/src/commands/querying_mpd_status/currentsong.rs b/src/commands/querying_mpd_status/currentsong.rs index 1ce180a..e9ec3e3 100644 --- a/src/commands/querying_mpd_status/currentsong.rs +++ b/src/commands/querying_mpd_status/currentsong.rs @@ -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) diff --git a/src/commands/querying_mpd_status/idle.rs b/src/commands/querying_mpd_status/idle.rs index 5edc479..cdb0d36 100644 --- a/src/commands/querying_mpd_status/idle.rs +++ b/src/commands/querying_mpd_status/idle.rs @@ -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; diff --git a/src/commands/querying_mpd_status/stats.rs b/src/commands/querying_mpd_status/stats.rs index 4d7438f..a3def8f 100644 --- a/src/commands/querying_mpd_status/stats.rs +++ b/src/commands/querying_mpd_status/stats.rs @@ -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, }, }; diff --git a/src/commands/querying_mpd_status/status.rs b/src/commands/querying_mpd_status/status.rs index e245876..1712f36 100644 --- a/src/commands/querying_mpd_status/status.rs +++ b/src/commands/querying_mpd_status/status.rs @@ -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)] diff --git a/src/commands/queue/add.rs b/src/commands/queue/add.rs index ce11c9e..53c8fa5 100644 --- a/src/commands/queue/add.rs +++ b/src/commands/queue/add.rs @@ -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; diff --git a/src/commands/queue/addid.rs b/src/commands/queue/addid.rs index 885ddd3..a8a37c7 100644 --- a/src/commands/queue/addid.rs +++ b/src/commands/queue/addid.rs @@ -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; diff --git a/src/commands/queue/addtagid.rs b/src/commands/queue/addtagid.rs index 20cedf3..aeefe83 100644 --- a/src/commands/queue/addtagid.rs +++ b/src/commands/queue/addtagid.rs @@ -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; diff --git a/src/commands/queue/clear.rs b/src/commands/queue/clear.rs index 9a2e93a..12f40cb 100644 --- a/src/commands/queue/clear.rs +++ b/src/commands/queue/clear.rs @@ -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; diff --git a/src/commands/queue/cleartagid.rs b/src/commands/queue/cleartagid.rs index 089e3ee..f35f64b 100644 --- a/src/commands/queue/cleartagid.rs +++ b/src/commands/queue/cleartagid.rs @@ -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; diff --git a/src/commands/queue/delete.rs b/src/commands/queue/delete.rs index ba6a9ef..9ce9938 100644 --- a/src/commands/queue/delete.rs +++ b/src/commands/queue/delete.rs @@ -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; diff --git a/src/commands/queue/deleteid.rs b/src/commands/queue/deleteid.rs index 8df9afb..9a5fadf 100644 --- a/src/commands/queue/deleteid.rs +++ b/src/commands/queue/deleteid.rs @@ -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; diff --git a/src/commands/queue/move_.rs b/src/commands/queue/move_.rs index 645020e..18686c3 100644 --- a/src/commands/queue/move_.rs +++ b/src/commands/queue/move_.rs @@ -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; diff --git a/src/commands/queue/moveid.rs b/src/commands/queue/moveid.rs index 73d72a9..7670432 100644 --- a/src/commands/queue/moveid.rs +++ b/src/commands/queue/moveid.rs @@ -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; diff --git a/src/commands/queue/playlist.rs b/src/commands/queue/playlist.rs index 6893287..b8a9d39 100644 --- a/src/commands/queue/playlist.rs +++ b/src/commands/queue/playlist.rs @@ -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; diff --git a/src/commands/queue/playlistfind.rs b/src/commands/queue/playlistfind.rs index 6e40905..48b7335 100644 --- a/src/commands/queue/playlistfind.rs +++ b/src/commands/queue/playlistfind.rs @@ -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; diff --git a/src/commands/queue/playlistid.rs b/src/commands/queue/playlistid.rs index 00f9a18..3e84d85 100644 --- a/src/commands/queue/playlistid.rs +++ b/src/commands/queue/playlistid.rs @@ -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; diff --git a/src/commands/queue/playlistinfo.rs b/src/commands/queue/playlistinfo.rs index df2d1f1..bfaeb59 100644 --- a/src/commands/queue/playlistinfo.rs +++ b/src/commands/queue/playlistinfo.rs @@ -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; diff --git a/src/commands/queue/playlistsearch.rs b/src/commands/queue/playlistsearch.rs index a1bb34b..cd9b2dd 100644 --- a/src/commands/queue/playlistsearch.rs +++ b/src/commands/queue/playlistsearch.rs @@ -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; diff --git a/src/commands/queue/plchanges.rs b/src/commands/queue/plchanges.rs index b8cffe0..855e78c 100644 --- a/src/commands/queue/plchanges.rs +++ b/src/commands/queue/plchanges.rs @@ -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; diff --git a/src/commands/queue/plchangesposid.rs b/src/commands/queue/plchangesposid.rs index 2b329df..8490ce9 100644 --- a/src/commands/queue/plchangesposid.rs +++ b/src/commands/queue/plchangesposid.rs @@ -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; diff --git a/src/commands/queue/prio.rs b/src/commands/queue/prio.rs index e62ec55..5f8289e 100644 --- a/src/commands/queue/prio.rs +++ b/src/commands/queue/prio.rs @@ -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; diff --git a/src/commands/queue/prioid.rs b/src/commands/queue/prioid.rs index 7f46b82..51dad9f 100644 --- a/src/commands/queue/prioid.rs +++ b/src/commands/queue/prioid.rs @@ -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; diff --git a/src/commands/queue/rangeid.rs b/src/commands/queue/rangeid.rs index 0db55be..6c5cf51 100644 --- a/src/commands/queue/rangeid.rs +++ b/src/commands/queue/rangeid.rs @@ -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, TimeInterval}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct RangeId; diff --git a/src/commands/queue/shuffle.rs b/src/commands/queue/shuffle.rs index aff89eb..798ddbd 100644 --- a/src/commands/queue/shuffle.rs +++ b/src/commands/queue/shuffle.rs @@ -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 Shuffle; diff --git a/src/commands/queue/swap.rs b/src/commands/queue/swap.rs index 47b73e2..3086bca 100644 --- a/src/commands/queue/swap.rs +++ b/src/commands/queue/swap.rs @@ -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::SongPosition, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct Swap; diff --git a/src/commands/queue/swapid.rs b/src/commands/queue/swapid.rs index d7ea100..87ab2d3 100644 --- a/src/commands/queue/swapid.rs +++ b/src/commands/queue/swapid.rs @@ -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, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct SwapId; diff --git a/src/commands/reflection/commands.rs b/src/commands/reflection/commands.rs index ea413ef..396a3b9 100644 --- a/src/commands/reflection/commands.rs +++ b/src/commands/reflection/commands.rs @@ -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 Commands; diff --git a/src/commands/reflection/config.rs b/src/commands/reflection/config.rs index 743871a..fa3c7d0 100644 --- a/src/commands/reflection/config.rs +++ b/src/commands/reflection/config.rs @@ -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, - get_and_parse_property, get_property, - }, + response_tokenizer::{ResponseAttributes, get_and_parse_property, get_property}, }; pub struct Config; diff --git a/src/commands/reflection/decoders.rs b/src/commands/reflection/decoders.rs index 1751f75..1c2f091 100644 --- a/src/commands/reflection/decoders.rs +++ b/src/commands/reflection/decoders.rs @@ -1,11 +1,9 @@ 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 Decoders; @@ -38,7 +36,7 @@ impl Command for Decoders { ) -> Result> { let mut result = Vec::new(); let mut current_decoder: Option = None; - for (key, value) in parts.0.into_iter() { + for (key, value) in Vec::from(parts).into_iter() { match key { "plugin" => { if let Some(decoder) = current_decoder.take() { diff --git a/src/commands/reflection/not_commands.rs b/src/commands/reflection/not_commands.rs index 0742f51..63e28c0 100644 --- a/src/commands/reflection/not_commands.rs +++ b/src/commands/reflection/not_commands.rs @@ -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 NotCommands; diff --git a/src/commands/reflection/url_handlers.rs b/src/commands/reflection/url_handlers.rs index 61480cc..9a5db55 100644 --- a/src/commands/reflection/url_handlers.rs +++ b/src/commands/reflection/url_handlers.rs @@ -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 UrlHandlers; diff --git a/src/commands/stickers/sticker_dec.rs b/src/commands/stickers/sticker_dec.rs index af1a10c..c903c26 100644 --- a/src/commands/stickers/sticker_dec.rs +++ b/src/commands/stickers/sticker_dec.rs @@ -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::{StickerType, Uri}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct StickerDec; diff --git a/src/commands/stickers/sticker_delete.rs b/src/commands/stickers/sticker_delete.rs index 14c59cf..b9e2113 100644 --- a/src/commands/stickers/sticker_delete.rs +++ b/src/commands/stickers/sticker_delete.rs @@ -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::{StickerType, Uri}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct StickerDelete; diff --git a/src/commands/stickers/sticker_find.rs b/src/commands/stickers/sticker_find.rs index 68c5a6f..d5f289c 100644 --- a/src/commands/stickers/sticker_find.rs +++ b/src/commands/stickers/sticker_find.rs @@ -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::{Sort, StickerType, Uri, WindowRange}, + request_tokenizer::RequestTokenizer, + response_tokenizer::{ResponseAttributes, expect_property_type}, }; pub struct StickerFind; diff --git a/src/commands/stickers/sticker_get.rs b/src/commands/stickers/sticker_get.rs index 6ab59f9..338992b 100644 --- a/src/commands/stickers/sticker_get.rs +++ b/src/commands/stickers/sticker_get.rs @@ -1,12 +1,10 @@ use serde::{Deserialize, Serialize}; use crate::{ - request_tokenizer::RequestTokenizer, - commands::{ - Command, Request, RequestParserError, RequestParserResult, ResponseAttributes, - ResponseParserError, get_next_property, - }, + commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError}, common::{StickerType, Uri}, + request_tokenizer::RequestTokenizer, + response_tokenizer::{ResponseAttributes, get_next_property}, }; pub struct StickerGet; diff --git a/src/commands/stickers/sticker_inc.rs b/src/commands/stickers/sticker_inc.rs index 5bc4562..4b97343 100644 --- a/src/commands/stickers/sticker_inc.rs +++ b/src/commands/stickers/sticker_inc.rs @@ -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::{StickerType, Uri}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct StickerInc; diff --git a/src/commands/stickers/sticker_list.rs b/src/commands/stickers/sticker_list.rs index bb66a98..5b3015f 100644 --- a/src/commands/stickers/sticker_list.rs +++ b/src/commands/stickers/sticker_list.rs @@ -3,12 +3,10 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; use crate::{ - request_tokenizer::RequestTokenizer, - commands::{ - Command, GenericResponseValue, Request, RequestParserError, RequestParserResult, - ResponseAttributes, ResponseParserError, - }, + commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError}, common::{StickerType, Uri}, + request_tokenizer::RequestTokenizer, + response_tokenizer::{GenericResponseValue, ResponseAttributes}, }; pub struct StickerList; diff --git a/src/commands/stickers/sticker_set.rs b/src/commands/stickers/sticker_set.rs index 17aa0fa..34d2b94 100644 --- a/src/commands/stickers/sticker_set.rs +++ b/src/commands/stickers/sticker_set.rs @@ -1,12 +1,12 @@ use serde::{Deserialize, Serialize}; use crate::{ - request_tokenizer::RequestTokenizer, commands::{ Command, Request, RequestParserError, RequestParserResult, ResponseAttributes, ResponseParserError, }, common::{StickerType, Uri}, + request_tokenizer::RequestTokenizer, }; pub struct StickerSet; diff --git a/src/commands/stickers/stickernames.rs b/src/commands/stickers/stickernames.rs index d899581..f97fc53 100644 --- a/src/commands/stickers/stickernames.rs +++ b/src/commands/stickers/stickernames.rs @@ -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 StickerNames; @@ -28,12 +26,12 @@ impl Command for StickerNames { fn parse_response( parts: ResponseAttributes<'_>, ) -> Result> { - if let Some((k, _)) = parts.0.iter().find(|(k, _)| *k != "name") { + let parts_: Vec<_> = parts.into(); + if let Some((k, _)) = parts_.iter().find(|(k, _)| *k != "name") { 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::, ResponseParserError>>()?; diff --git a/src/commands/stickers/stickernamestypes.rs b/src/commands/stickers/stickernamestypes.rs index f3ed9bc..78bb5b8 100644 --- a/src/commands/stickers/stickernamestypes.rs +++ b/src/commands/stickers/stickernamestypes.rs @@ -1,12 +1,10 @@ use std::collections::HashMap; use crate::{ - request_tokenizer::RequestTokenizer, - commands::{ - Command, Request, RequestParserResult, ResponseAttributes, ResponseParserError, - expect_property_type, - }, + commands::{Command, Request, RequestParserResult, ResponseParserError}, common::StickerType, + request_tokenizer::RequestTokenizer, + response_tokenizer::{ResponseAttributes, expect_property_type}, }; pub struct StickerNamesTypes; diff --git a/src/commands/stickers/stickertypes.rs b/src/commands/stickers/stickertypes.rs index 331d6e6..a3622d5 100644 --- a/src/commands/stickers/stickertypes.rs +++ b/src/commands/stickers/stickertypes.rs @@ -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 StickerTypes; @@ -28,12 +26,12 @@ impl Command for StickerTypes { fn parse_response( parts: ResponseAttributes<'_>, ) -> Result> { - if let Some((k, _)) = parts.0.iter().find(|(k, _)| *k != "stickertype") { + let parts_: Vec<_> = parts.into(); + if let Some((k, _)) = parts_.iter().find(|(k, _)| *k != "stickertype") { 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::, ResponseParserError>>()?; diff --git a/src/commands/stored_playlists/listplaylist.rs b/src/commands/stored_playlists/listplaylist.rs index 5842dc9..3bdf84e 100644 --- a/src/commands/stored_playlists/listplaylist.rs +++ b/src/commands/stored_playlists/listplaylist.rs @@ -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::{PlaylistName, WindowRange}, + request_tokenizer::RequestTokenizer, + response_tokenizer::{ResponseAttributes, expect_property_type}, }; pub struct ListPlaylist; diff --git a/src/commands/stored_playlists/listplaylistinfo.rs b/src/commands/stored_playlists/listplaylistinfo.rs index c21f88a..b1c6a28 100644 --- a/src/commands/stored_playlists/listplaylistinfo.rs +++ b/src/commands/stored_playlists/listplaylistinfo.rs @@ -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::{PlaylistName, WindowRange}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct ListPlaylistInfo; diff --git a/src/commands/stored_playlists/listplaylists.rs b/src/commands/stored_playlists/listplaylists.rs index 25f09d7..0f860c5 100644 --- a/src/commands/stored_playlists/listplaylists.rs +++ b/src/commands/stored_playlists/listplaylists.rs @@ -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 ListPlaylists; diff --git a/src/commands/stored_playlists/load.rs b/src/commands/stored_playlists/load.rs index 91db802..f3799e6 100644 --- a/src/commands/stored_playlists/load.rs +++ b/src/commands/stored_playlists/load.rs @@ -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::{PlaylistName, SongPosition, WindowRange}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct Load; diff --git a/src/commands/stored_playlists/playlistadd.rs b/src/commands/stored_playlists/playlistadd.rs index 0862791..a62cd3a 100644 --- a/src/commands/stored_playlists/playlistadd.rs +++ b/src/commands/stored_playlists/playlistadd.rs @@ -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::{PlaylistName, SongPosition, Uri}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct PlaylistAdd; diff --git a/src/commands/stored_playlists/playlistclear.rs b/src/commands/stored_playlists/playlistclear.rs index 9c5aa64..9f1e746 100644 --- a/src/commands/stored_playlists/playlistclear.rs +++ b/src/commands/stored_playlists/playlistclear.rs @@ -1,10 +1,8 @@ use crate::{ - request_tokenizer::RequestTokenizer, - commands::{ - Command, Request, RequestParserError, RequestParserResult, ResponseAttributes, - ResponseParserError, - }, + commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError}, common::PlaylistName, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct PlaylistClear; diff --git a/src/commands/stored_playlists/playlistdelete.rs b/src/commands/stored_playlists/playlistdelete.rs index 5a78c48..7c48ad5 100644 --- a/src/commands/stored_playlists/playlistdelete.rs +++ b/src/commands/stored_playlists/playlistdelete.rs @@ -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::{OneOrRange, PlaylistName}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct PlaylistDelete; diff --git a/src/commands/stored_playlists/playlistlength.rs b/src/commands/stored_playlists/playlistlength.rs index ac2dfe3..847f021 100644 --- a/src/commands/stored_playlists/playlistlength.rs +++ b/src/commands/stored_playlists/playlistlength.rs @@ -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::PlaylistName, + request_tokenizer::RequestTokenizer, + response_tokenizer::{ResponseAttributes, get_and_parse_property}, }; pub struct PlaylistLength; diff --git a/src/commands/stored_playlists/playlistmove.rs b/src/commands/stored_playlists/playlistmove.rs index 65c6573..044f90d 100644 --- a/src/commands/stored_playlists/playlistmove.rs +++ b/src/commands/stored_playlists/playlistmove.rs @@ -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::{OneOrRange, PlaylistName, SongPosition}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct PlaylistMove; diff --git a/src/commands/stored_playlists/rename.rs b/src/commands/stored_playlists/rename.rs index dc4b2da..2aa66f8 100644 --- a/src/commands/stored_playlists/rename.rs +++ b/src/commands/stored_playlists/rename.rs @@ -1,11 +1,9 @@ use serde::{Deserialize, Serialize}; use crate::{ + commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError}, request_tokenizer::RequestTokenizer, - commands::{ - Command, Request, RequestParserError, RequestParserResult, ResponseAttributes, - ResponseParserError, - }, + response_tokenizer::ResponseAttributes, }; pub struct Rename; diff --git a/src/commands/stored_playlists/rm.rs b/src/commands/stored_playlists/rm.rs index 3fce081..32aa491 100644 --- a/src/commands/stored_playlists/rm.rs +++ b/src/commands/stored_playlists/rm.rs @@ -1,10 +1,8 @@ use crate::{ - request_tokenizer::RequestTokenizer, - commands::{ - Command, Request, RequestParserError, RequestParserResult, ResponseAttributes, - ResponseParserError, - }, + commands::{Command, Request, RequestParserError, RequestParserResult, ResponseParserError}, common::PlaylistName, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct Rm; diff --git a/src/commands/stored_playlists/save.rs b/src/commands/stored_playlists/save.rs index b38cdcf..7bf69a7 100644 --- a/src/commands/stored_playlists/save.rs +++ b/src/commands/stored_playlists/save.rs @@ -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::{PlaylistName, SaveMode}, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct Save; diff --git a/src/commands/stored_playlists/searchplaylist.rs b/src/commands/stored_playlists/searchplaylist.rs index 5ac60ee..4eb3f66 100644 --- a/src/commands/stored_playlists/searchplaylist.rs +++ b/src/commands/stored_playlists/searchplaylist.rs @@ -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::{PlaylistName, WindowRange}, filter::Filter, + request_tokenizer::RequestTokenizer, + response_tokenizer::ResponseAttributes, }; pub struct SearchPlaylist; diff --git a/src/lib.rs b/src/lib.rs index 946d18e..6eb61f5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,12 +3,13 @@ //! //! It does not provide any client or server implementation -mod request_tokenizer; mod commands; mod common; mod filter; mod request; +mod request_tokenizer; mod response; +mod response_tokenizer; mod server; pub use request::Request; diff --git a/src/request.rs b/src/request.rs index 4868abb..88cdf31 100644 --- a/src/request.rs +++ b/src/request.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; -use crate::request_tokenizer::RequestTokenizer; use crate::common::*; +use crate::request_tokenizer::RequestTokenizer; use crate::commands::*; use crate::filter::Filter; diff --git a/src/response_tokenizer.rs b/src/response_tokenizer.rs new file mode 100644 index 0000000..c5eda43 --- /dev/null +++ b/src/response_tokenizer.rs @@ -0,0 +1,311 @@ +pub type GenericResponseResult<'a> = Result, &'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>), +} + +#[derive(Debug, Clone, PartialEq)] +pub struct ResponseAttributes<'a>(Vec<(&'a str, GenericResponseValue<'a>)>); + +impl<'a> ResponseAttributes<'a> { + pub fn new(raw: &'a str) -> Result> { + 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>> for ResponseAttributes<'a> { + fn from(map: HashMap<&'a str, GenericResponseValue<'a>>) -> Self { + Self(map.into_iter().collect()) + } +} + +impl<'a> From> 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> for Vec<(&'a str, GenericResponseValue<'a>)> { + fn from(val: ResponseAttributes<'a>) -> Self { + val.0 + } +} + +impl<'a> From)>> 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::response_tokenizer::GenericResponseValue::$variant(value)) => Some(value), + Some(value) => { + let actual_type = match value { + crate::response_tokenizer::GenericResponseValue::Text(_) => "Text", + crate::response_tokenizer::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::response_tokenizer::_expect_property_type!($property, $name, $variant) + }; +} + +macro_rules! expect_property_type { + ($property:expr, $name:expr, $variant:ident) => {{ + let prop = crate::response_tokenizer::_expect_property_type!($property, $name, $variant); + crate::response_tokenizer::_unwrap_optional_property_type!($name, prop) + }}; +} + +macro_rules! get_optional_property { + ($parts:expr, $name:literal, $variant:ident) => { + crate::response_tokenizer::_expect_property_type!( + { $parts.get($name).map(|v| *v) }, + $name, + $variant + ) + }; +} + +macro_rules! get_property { + ($parts:expr, $name:literal, $variant:ident) => {{ + let prop = crate::response_tokenizer::_expect_property_type!( + { $parts.get($name).map(|v| *v) }, + $name, + $variant + ); + crate::response_tokenizer::_unwrap_optional_property_type!($name, prop) + }}; +} + +macro_rules! get_and_parse_optional_property { + ($parts:ident, $name:literal, $variant:ident) => {{ + let prop = crate::response_tokenizer::_expect_property_type!( + { $parts.get($name).map(|v| *v) }, + $name, + $variant + ); + crate::response_tokenizer::_parse_optional_property_type!($name, prop) + }}; +} + +macro_rules! get_and_parse_property { + ($parts:ident, $name:literal, $variant:ident) => {{ + let prop = crate::response_tokenizer::_expect_property_type!( + { $parts.get($name).map(|v| *v) }, + $name, + $variant + ); + let prop = crate::response_tokenizer::_parse_optional_property_type!($name, prop); + crate::response_tokenizer::_unwrap_optional_property_type!($name, prop) + }}; +} + +macro_rules! get_next_optional_property { + ($parts:ident, $variant:ident) => { + match $parts.next() { + Some((name, value)) => { + crate::response_tokenizer::_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::response_tokenizer::_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::response_tokenizer::_expect_property_type!( + { Some(value) }, + name, + $variant + ); + prop.map(|value| { + ( + name, + crate::response_tokenizer::_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::response_tokenizer::_expect_property_type!( + { Some(value) }, + name, + $variant + ); + let prop = crate::response_tokenizer::_parse_optional_property_type!(name, prop); + ( + name, + crate::response_tokenizer::_unwrap_optional_property_type!(name, prop), + ) + } + None => return Err(crate::commands::ResponseParserError::UnexpectedEOF), + } + }; +} + +use std::collections::{HashMap, HashSet}; + +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; + +use crate::commands::ResponseParserError; + +#[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); + } +}