use std::sync::{Arc, Mutex};
use tf_core::SubscriptionList;
#[cfg(feature = "lbry")]
use tf_lbry::LbrySubscription;
use tf_observer::{Observable, Observer, ObserverList};
#[cfg(feature = "peertube")]
use tf_pt::PTSubscription;
#[cfg(test)]
use tf_test::TestSubscription;
#[cfg(feature = "youtube")]
use tf_yt::YTSubscription;
use crate::AnySubscription;
#[derive(Clone)]
pub struct AnySubscriptionList {
observers: ObserverList<SubscriptionEvent>,
#[cfg(feature = "youtube")]
yt_subscriptions: Arc<Mutex<SubscriptionList<YTSubscription>>>,
#[cfg(feature = "peertube")]
pt_subscriptions: Arc<Mutex<SubscriptionList<PTSubscription>>>,
#[cfg(feature = "lbry")]
lbry_subscriptions: Arc<Mutex<SubscriptionList<LbrySubscription>>>,
#[cfg(test)]
test_subscriptions: Arc<Mutex<SubscriptionList<TestSubscription>>>,
}
impl AnySubscriptionList {
pub(crate) fn new() -> Self {
AnySubscriptionList {
observers: ObserverList::default(),
#[cfg(feature = "youtube")]
yt_subscriptions: Arc::new(Mutex::new(SubscriptionList::default())),
#[cfg(feature = "peertube")]
pt_subscriptions: Arc::new(Mutex::new(SubscriptionList::default())),
#[cfg(feature = "lbry")]
lbry_subscriptions: Arc::new(Mutex::new(SubscriptionList::default())),
#[cfg(test)]
test_subscriptions: Arc::new(Mutex::new(SubscriptionList::default())),
}
}
#[cfg(feature = "youtube")]
pub(crate) fn yt_subscriptions(&mut self, sub: Arc<Mutex<SubscriptionList<YTSubscription>>>) {
self.yt_subscriptions = sub;
}
#[cfg(feature = "youtube")]
pub(crate) fn pt_subscriptions(&mut self, sub: Arc<Mutex<SubscriptionList<PTSubscription>>>) {
self.pt_subscriptions = sub;
}
#[cfg(feature = "lbry")]
pub(crate) fn lbry_subscriptions(
&mut self,
sub: Arc<Mutex<SubscriptionList<LbrySubscription>>>,
) {
self.lbry_subscriptions = sub;
}
#[cfg(test)]
pub(crate) fn test_subscriptions(
&mut self,
sub: Arc<Mutex<SubscriptionList<TestSubscription>>>,
) {
self.test_subscriptions = sub;
}
pub fn add(&self, subscription: AnySubscription) {
match subscription.clone() {
#[cfg(feature = "youtube")]
AnySubscription::Youtube(sub) => self.yt_subscriptions.lock().unwrap().add(sub),
#[cfg(feature = "peertube")]
AnySubscription::Peertube(sub) => self.pt_subscriptions.lock().unwrap().add(sub),
#[cfg(feature = "lbry")]
AnySubscription::Lbry(sub) => self.lbry_subscriptions.lock().unwrap().add(sub),
#[cfg(test)]
AnySubscription::Test(sub) => self.test_subscriptions.lock().unwrap().add(sub),
}
self.observers.notify(SubscriptionEvent::Add(subscription))
}
pub fn remove(&self, subscription: AnySubscription) {
match subscription.clone() {
#[cfg(feature = "youtube")]
AnySubscription::Youtube(sub) => self.yt_subscriptions.lock().unwrap().remove(sub),
#[cfg(feature = "peertube")]
AnySubscription::Peertube(sub) => self.pt_subscriptions.lock().unwrap().remove(sub),
#[cfg(feature = "lbry")]
AnySubscription::Lbry(sub) => self.lbry_subscriptions.lock().unwrap().remove(sub),
#[cfg(test)]
AnySubscription::Test(sub) => self.test_subscriptions.lock().unwrap().remove(sub),
}
self.observers
.notify(SubscriptionEvent::Remove(subscription))
}
pub fn update(&self, subscription: AnySubscription) {
match subscription.clone() {
#[cfg(feature = "youtube")]
AnySubscription::Youtube(sub) => self.yt_subscriptions.lock().unwrap().update(sub),
#[cfg(feature = "peertube")]
AnySubscription::Peertube(sub) => self.pt_subscriptions.lock().unwrap().update(sub),
#[cfg(feature = "lbry")]
AnySubscription::Lbry(sub) => self.lbry_subscriptions.lock().unwrap().update(sub),
#[cfg(test)]
AnySubscription::Test(sub) => self.test_subscriptions.lock().unwrap().update(sub),
}
self.observers
.notify(SubscriptionEvent::Update(subscription))
}
pub fn iter(&self) -> impl Iterator<Item = AnySubscription> {
let mut vec = vec![];
#[cfg(feature = "youtube")]
vec.append(
&mut self
.yt_subscriptions
.lock()
.unwrap()
.subscriptions()
.into_iter()
.map(|s| s.into())
.collect::<Vec<AnySubscription>>(),
);
#[cfg(feature = "peertube")]
vec.append(
&mut self
.pt_subscriptions
.lock()
.unwrap()
.subscriptions()
.into_iter()
.map(|s| s.into())
.collect::<Vec<AnySubscription>>(),
);
#[cfg(feature = "lbry")]
vec.append(
&mut self
.lbry_subscriptions
.lock()
.unwrap()
.subscriptions()
.into_iter()
.map(|s| s.into())
.collect::<Vec<AnySubscription>>(),
);
#[cfg(test)]
vec.append(
&mut self
.test_subscriptions
.lock()
.unwrap()
.subscriptions()
.into_iter()
.map(|s| s.into())
.collect::<Vec<AnySubscription>>()
.clone(),
);
vec.into_iter()
}
}
impl Default for AnySubscriptionList {
fn default() -> Self {
AnySubscriptionList::new()
}
}
#[derive(Clone, Debug)]
pub enum SubscriptionEvent {
Add(AnySubscription),
Remove(AnySubscription),
Update(AnySubscription),
}
impl Observable<SubscriptionEvent> for AnySubscriptionList {
fn attach(
&mut self,
observer: std::sync::Weak<Mutex<Box<dyn Observer<SubscriptionEvent> + Send>>>,
) {
self.observers.attach(observer)
}
fn detach(
&mut self,
observer: std::sync::Weak<Mutex<Box<dyn Observer<SubscriptionEvent> + Send>>>,
) {
self.observers.detach(observer)
}
}