diff --git a/connect/src/spirc.rs b/connect/src/spirc.rs index 6a7ad503..65138bd9 100644 --- a/connect/src/spirc.rs +++ b/connect/src/spirc.rs @@ -50,6 +50,8 @@ use tokio::{sync::mpsc, time::sleep}; pub enum SpircError { #[error("response payload empty")] NoData, + #[error("{0} had no uri")] + NoUri(&'static str), #[error("message pushed for another URI")] InvalidUri(String), #[error("tried resolving not allowed context: {0:?}")] @@ -64,7 +66,7 @@ impl From for Error { fn from(err: SpircError) -> Self { use SpircError::*; match err { - NoData | NotAllowedContext(_) => Error::unavailable(err), + NoData | NoUri(_) | NotAllowedContext(_) => Error::unavailable(err), InvalidUri(_) | FailedDealerSetup => Error::aborted(err), UnknownEndpoint(_) => Error::unimplemented(err), } @@ -1037,7 +1039,11 @@ impl SpircTask { .map(|o| o.repeating_track.unwrap_or_default()) .unwrap_or_else(|| self.connect_state.repeat_track()); - let context_uri = play.context.uri.as_ref().ok_or(SpircError::NoData)?.clone(); + let context_uri = play + .context + .uri + .clone() + .ok_or(SpircError::NoUri("context"))?; self.handle_load( SpircLoadCommand { @@ -1093,7 +1099,7 @@ impl SpircTask { fn handle_transfer(&mut self, mut transfer: TransferState) -> Result<(), Error> { let mut ctx_uri = match transfer.current_session.context.uri { - None => Err(SpircError::NoData)?, + None => Err(SpircError::NoUri("transfer context"))?, Some(ref uri) => uri.clone(), }; @@ -1517,7 +1523,9 @@ impl SpircTask { &mut self, playlist_modification_info: PlaylistModificationInfo, ) -> Result<(), Error> { - let uri = playlist_modification_info.uri.ok_or(SpircError::NoData)?; + let uri = playlist_modification_info + .uri + .ok_or(SpircError::NoUri("playlist modification"))?; let uri = String::from_utf8(uri)?; if self.connect_state.context_uri() != &uri { diff --git a/connect/src/state.rs b/connect/src/state.rs index 02e028ce..eff83bac 100644 --- a/connect/src/state.rs +++ b/connect/src/state.rs @@ -44,14 +44,15 @@ const SPOTIFY_MAX_NEXT_TRACKS_SIZE: usize = 80; pub enum StateError { #[error("the current track couldn't be resolved from the transfer state")] CouldNotResolveTrackFromTransfer, - #[error("message field {0} was not available")] - MessageFieldNone(String), #[error("context is not available. type: {0:?}")] NoContext(ContextType), #[error("could not find track {0:?} in context of {1}")] CanNotFindTrackInContext(Option, usize), #[error("currently {action} is not allowed because {reason}")] - CurrentlyDisallowed { action: String, reason: String }, + CurrentlyDisallowed { + action: &'static str, + reason: String, + }, #[error("the provided context has no tracks")] ContextHasNoTracks, #[error("playback of local files is not supported")] @@ -65,7 +66,6 @@ impl From for Error { use StateError::*; match err { CouldNotResolveTrackFromTransfer - | MessageFieldNone(_) | NoContext(_) | CanNotFindTrackInContext(_, _) | ContextHasNoTracks diff --git a/connect/src/state/context.rs b/connect/src/state/context.rs index b65a4d51..11827cc5 100644 --- a/connect/src/state/context.rs +++ b/connect/src/state/context.rs @@ -196,7 +196,7 @@ impl ConnectState { let mut new_context = self.state_context_from_page( page, context.restrictions.take(), - context.uri.as_ref(), + context.uri.as_deref(), None, ); @@ -236,7 +236,7 @@ impl ConnectState { self.autoplay_context = Some(self.state_context_from_page( page, context.restrictions.take(), - context.uri.as_ref(), + context.uri.as_deref(), Some(Provider::Autoplay), )) } @@ -249,7 +249,7 @@ impl ConnectState { &mut self, page: ContextPage, restrictions: Option, - new_context_uri: Option<&String>, + new_context_uri: Option<&str>, provider: Option, ) -> StateContext { let new_context_uri = new_context_uri.unwrap_or(self.context_uri()); diff --git a/connect/src/state/options.rs b/connect/src/state/options.rs index b6bc331c..b9c2c576 100644 --- a/connect/src/state/options.rs +++ b/connect/src/state/options.rs @@ -41,7 +41,7 @@ impl ConnectState { .first() { Err(StateError::CurrentlyDisallowed { - action: "shuffle".to_string(), + action: "shuffle", reason: reason.clone(), })? }