278 lines
6.2 KiB
Rust
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);
|
|
}
|
|
}
|