diff --git a/connect/src/context_resolver.rs b/connect/src/context_resolver.rs index 22673741d..982a51b5f 100644 --- a/connect/src/context_resolver.rs +++ b/connect/src/context_resolver.rs @@ -1,35 +1,37 @@ -use crate::state::context::ContextType; use crate::{ core::{Error, Session}, protocol::{ autoplay_context_request::AutoplayContextRequest, player::{Context, TransferState}, }, - state::{context::UpdateContext, ConnectState}, + state::{ + context::{ContextType, UpdateContext}, + ConnectState, + }, }; use std::cmp::PartialEq; use std::{ collections::{HashMap, VecDeque}, fmt::{Display, Formatter}, - hash::{Hash, Hasher}, + hash::Hash, time::Duration, }; use thiserror::Error as ThisError; use tokio::time::Instant; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Hash, PartialEq, Eq)] enum Resolve { Uri(String), Context(Context), } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Hash, PartialEq, Eq)] pub(super) enum ContextAction { Append, Replace, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Hash, PartialEq, Eq)] pub(super) struct ResolveContext { resolve: Resolve, fallback: Option, @@ -103,26 +105,6 @@ impl Display for ResolveContext { } } -impl PartialEq for ResolveContext { - fn eq(&self, other: &Self) -> bool { - let eq_context = self.context_uri() == other.context_uri(); - let eq_resolve = self.resolve_uri() == other.resolve_uri(); - let eq_autoplay = self.update == other.update; - - eq_context && eq_resolve && eq_autoplay - } -} - -impl Eq for ResolveContext {} - -impl Hash for ResolveContext { - fn hash(&self, state: &mut H) { - self.context_uri().hash(state); - self.resolve_uri().hash(state); - self.update.hash(state); - } -} - #[derive(Debug, ThisError)] enum ContextResolverError { #[error("no next context to resolve")] diff --git a/connect/src/state/context.rs b/connect/src/state/context.rs index b6276bc1d..57f92db86 100644 --- a/connect/src/state/context.rs +++ b/connect/src/state/context.rs @@ -34,7 +34,7 @@ pub enum ContextType { Autoplay, } -#[derive(Debug, PartialEq, Hash, Copy, Clone)] +#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)] pub enum UpdateContext { Default, Autoplay, diff --git a/protocol/src/impl_trait.rs b/protocol/src/impl_trait.rs new file mode 100644 index 000000000..197ffdad1 --- /dev/null +++ b/protocol/src/impl_trait.rs @@ -0,0 +1 @@ +mod player_context; diff --git a/protocol/src/impl_trait/player_context.rs b/protocol/src/impl_trait/player_context.rs new file mode 100644 index 000000000..5886b81ca --- /dev/null +++ b/protocol/src/impl_trait/player_context.rs @@ -0,0 +1,13 @@ +use crate::player::Context; +use protobuf::Message; +use std::hash::{Hash, Hasher}; + +impl Hash for Context { + fn hash(&self, state: &mut H) { + if let Ok(ctx) = self.write_to_bytes() { + ctx.hash(state) + } + } +} + +impl Eq for Context {} diff --git a/protocol/src/lib.rs b/protocol/src/lib.rs index 224043e76..c905ceb87 100644 --- a/protocol/src/lib.rs +++ b/protocol/src/lib.rs @@ -1,4 +1,6 @@ // This file is parsed by build.rs // Each included module will be compiled from the matching .proto definition. +mod impl_trait; + include!(concat!(env!("OUT_DIR"), "/mod.rs"));