tor_proto/util/sink_blocker/
boolean_policy.rs1use super::Policy;
4use tor_error::{Bug, internal};
5
6#[derive(Debug, Clone, Copy)]
8pub(crate) enum BooleanPolicy {
9 Blocked,
11 Unblocked,
13}
14
15impl Policy for BooleanPolicy {
16 fn is_blocking(&self) -> bool {
17 matches!(self, BooleanPolicy::Blocked)
18 }
19
20 fn take_one(&mut self) -> Result<(), Bug> {
24 match self {
25 BooleanPolicy::Blocked => {
26 Err(internal!("Tried to take_one on a blocked BooleanPolicy!"))
27 }
28 BooleanPolicy::Unblocked => Ok(()),
29 }
30 }
31}
32
33impl<S> super::SinkBlocker<S, BooleanPolicy> {
34 pub(crate) fn set_blocked(&mut self) {
36 self.update_policy(BooleanPolicy::Blocked);
37 }
38
39 pub(crate) fn set_unblocked(&mut self) {
41 self.update_policy(BooleanPolicy::Unblocked);
45 }
46}
47
48#[cfg(test)]
49mod test {
50 #![allow(clippy::bool_assert_comparison)]
52 #![allow(clippy::clone_on_copy)]
53 #![allow(clippy::dbg_macro)]
54 #![allow(clippy::mixed_attributes_style)]
55 #![allow(clippy::print_stderr)]
56 #![allow(clippy::print_stdout)]
57 #![allow(clippy::single_char_pattern)]
58 #![allow(clippy::unwrap_used)]
59 #![allow(clippy::unchecked_time_subtraction)]
60 #![allow(clippy::useless_vec)]
61 #![allow(clippy::needless_pass_by_value)]
62 use super::*;
65
66 #[test]
67 fn boolean_policy() {
68 let mut blocked = BooleanPolicy::Blocked;
69 assert_eq!(blocked.is_blocking(), true);
70 assert!(blocked.take_one().is_err());
71 assert_eq!(blocked.is_blocking(), true);
72
73 let mut unblocked = BooleanPolicy::Unblocked;
74 assert_eq!(unblocked.is_blocking(), false);
75 assert!(unblocked.take_one().is_ok());
76 assert_eq!(unblocked.is_blocking(), false);
77 }
78}