use super::Policy;
use tor_error::{Bug, internal};
#[derive(Debug, Clone, Copy)]
pub(crate) enum BooleanPolicy {
Blocked,
Unblocked,
}
impl Policy for BooleanPolicy {
fn is_blocking(&self) -> bool {
matches!(self, BooleanPolicy::Blocked)
}
fn take_one(&mut self) -> Result<(), Bug> {
match self {
BooleanPolicy::Blocked => {
Err(internal!("Tried to take_one on a blocked BooleanPolicy!"))
}
BooleanPolicy::Unblocked => Ok(()),
}
}
}
impl<S> super::SinkBlocker<S, BooleanPolicy> {
pub(crate) fn set_blocked(&mut self) {
self.update_policy(BooleanPolicy::Blocked);
}
pub(crate) fn set_unblocked(&mut self) {
self.update_policy(BooleanPolicy::Unblocked);
}
}
#[cfg(test)]
mod test {
#![allow(clippy::bool_assert_comparison)]
#![allow(clippy::clone_on_copy)]
#![allow(clippy::dbg_macro)]
#![allow(clippy::mixed_attributes_style)]
#![allow(clippy::print_stderr)]
#![allow(clippy::print_stdout)]
#![allow(clippy::single_char_pattern)]
#![allow(clippy::unwrap_used)]
#![allow(clippy::unchecked_time_subtraction)]
#![allow(clippy::useless_vec)]
#![allow(clippy::needless_pass_by_value)]
use super::*;
#[test]
fn boolean_policy() {
let mut blocked = BooleanPolicy::Blocked;
assert_eq!(blocked.is_blocking(), true);
assert!(blocked.take_one().is_err());
assert_eq!(blocked.is_blocking(), true);
let mut unblocked = BooleanPolicy::Unblocked;
assert_eq!(unblocked.is_blocking(), false);
assert!(unblocked.take_one().is_ok());
assert_eq!(unblocked.is_blocking(), false);
}
}