apub/apub-session/src/lib.rs
2021-11-17 22:17:36 -06:00

278 lines
6.2 KiB
Rust

use std::{
rc::Rc,
sync::{
atomic::{AtomicUsize, Ordering},
Arc,
},
};
use url::Url;
pub trait Session {
fn should_procede(&self, url: &Url) -> bool;
fn mark_success(&self, url: &Url);
fn mark_failure(&self, url: &Url);
}
pub struct RequestCountSession {
count: AtomicUsize,
max_requests: usize,
}
impl RequestCountSession {
pub fn max(max_requests: usize) -> Self {
Self {
count: AtomicUsize::new(0),
max_requests,
}
}
}
impl Session for RequestCountSession {
fn should_procede(&self, _: &Url) -> bool {
self.count.load(Ordering::Acquire) < self.max_requests
}
fn mark_success(&self, _: &Url) {
self.count.fetch_add(1, Ordering::AcqRel);
}
fn mark_failure(&self, _: &Url) {
self.count.fetch_add(1, Ordering::AcqRel);
}
}
impl<T> Session for Arc<T>
where
T: Session,
{
fn should_procede(&self, url: &Url) -> bool {
T::should_procede(&self, url)
}
fn mark_success(&self, url: &Url) {
T::mark_success(&self, url)
}
fn mark_failure(&self, url: &Url) {
T::mark_failure(&self, url)
}
}
impl<T> Session for Rc<T>
where
T: Session,
{
fn should_procede(&self, url: &Url) -> bool {
T::should_procede(&self, url)
}
fn mark_success(&self, url: &Url) {
T::mark_success(&self, url)
}
fn mark_failure(&self, url: &Url) {
T::mark_failure(&self, url)
}
}
impl<T> Session for Box<T>
where
T: Session,
{
fn should_procede(&self, url: &Url) -> bool {
T::should_procede(&self, url)
}
fn mark_success(&self, url: &Url) {
T::mark_success(&self, url)
}
fn mark_failure(&self, url: &Url) {
T::mark_failure(&self, url)
}
}
impl<T, U> Session for (T, U)
where
T: Session,
U: Session,
{
fn should_procede(&self, url: &Url) -> bool {
self.0.should_procede(url) && self.1.should_procede(url)
}
fn mark_success(&self, url: &Url) {
self.0.mark_success(url);
self.1.mark_success(url);
}
fn mark_failure(&self, url: &Url) {
self.0.mark_failure(url);
self.1.mark_failure(url);
}
}
impl<T, U, V> Session for (T, U, V)
where
T: Session,
U: Session,
V: Session,
{
fn should_procede(&self, url: &Url) -> bool {
self.0.should_procede(url) && self.1.should_procede(url) && self.2.should_procede(url)
}
fn mark_success(&self, url: &Url) {
self.0.mark_success(url);
self.1.mark_success(url);
self.2.mark_success(url);
}
fn mark_failure(&self, url: &Url) {
self.0.mark_failure(url);
self.1.mark_failure(url);
self.2.mark_failure(url);
}
}
impl<T, U, V, W> Session for (T, U, V, W)
where
T: Session,
U: Session,
V: Session,
W: Session,
{
fn should_procede(&self, url: &Url) -> bool {
self.0.should_procede(url)
&& self.1.should_procede(url)
&& self.2.should_procede(url)
&& self.3.should_procede(url)
}
fn mark_success(&self, url: &Url) {
self.0.mark_success(url);
self.1.mark_success(url);
self.2.mark_success(url);
self.3.mark_success(url);
}
fn mark_failure(&self, url: &Url) {
self.0.mark_failure(url);
self.1.mark_failure(url);
self.2.mark_failure(url);
self.3.mark_failure(url);
}
}
impl<T, U, V, W, X> Session for (T, U, V, W, X)
where
T: Session,
U: Session,
V: Session,
W: Session,
X: Session,
{
fn should_procede(&self, url: &Url) -> bool {
self.0.should_procede(url)
&& self.1.should_procede(url)
&& self.2.should_procede(url)
&& self.3.should_procede(url)
&& self.4.should_procede(url)
}
fn mark_success(&self, url: &Url) {
self.0.mark_success(url);
self.1.mark_success(url);
self.2.mark_success(url);
self.3.mark_success(url);
self.4.mark_success(url);
}
fn mark_failure(&self, url: &Url) {
self.0.mark_failure(url);
self.1.mark_failure(url);
self.2.mark_failure(url);
self.3.mark_failure(url);
self.4.mark_failure(url);
}
}
impl<T, U, V, W, X, Y> Session for (T, U, V, W, X, Y)
where
T: Session,
U: Session,
V: Session,
W: Session,
X: Session,
Y: Session,
{
fn should_procede(&self, url: &Url) -> bool {
self.0.should_procede(url)
&& self.1.should_procede(url)
&& self.2.should_procede(url)
&& self.3.should_procede(url)
&& self.4.should_procede(url)
&& self.5.should_procede(url)
}
fn mark_success(&self, url: &Url) {
self.0.mark_success(url);
self.1.mark_success(url);
self.2.mark_success(url);
self.3.mark_success(url);
self.4.mark_success(url);
self.5.mark_success(url);
}
fn mark_failure(&self, url: &Url) {
self.0.mark_failure(url);
self.1.mark_failure(url);
self.2.mark_failure(url);
self.3.mark_failure(url);
self.4.mark_failure(url);
self.5.mark_failure(url);
}
}
impl<T, U, V, W, X, Y, Z> Session for (T, U, V, W, X, Y, Z)
where
T: Session,
U: Session,
V: Session,
W: Session,
X: Session,
Y: Session,
Z: Session,
{
fn should_procede(&self, url: &Url) -> bool {
self.0.should_procede(url)
&& self.1.should_procede(url)
&& self.2.should_procede(url)
&& self.3.should_procede(url)
&& self.4.should_procede(url)
&& self.5.should_procede(url)
&& self.6.should_procede(url)
}
fn mark_success(&self, url: &Url) {
self.0.mark_success(url);
self.1.mark_success(url);
self.2.mark_success(url);
self.3.mark_success(url);
self.4.mark_success(url);
self.5.mark_success(url);
self.6.mark_success(url);
}
fn mark_failure(&self, url: &Url) {
self.0.mark_failure(url);
self.1.mark_failure(url);
self.2.mark_failure(url);
self.3.mark_failure(url);
self.4.mark_failure(url);
self.5.mark_failure(url);
self.6.mark_failure(url);
}
}