1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
use parking_lot::{Mutex, MutexGuard}; use std::{fmt, sync::Arc}; #[derive(Clone, Default)] pub(crate) struct ConsumerStatus(Arc<Mutex<ConsumerStatusInner>>); impl ConsumerStatus { pub(crate) fn state(&self) -> ConsumerState { self.lock().state() } pub(crate) fn try_lock(&self) -> Option<MutexGuard<'_, ConsumerStatusInner>> { self.0.try_lock() } pub(crate) fn lock(&self) -> MutexGuard<'_, ConsumerStatusInner> { self.0.lock() } } impl fmt::Debug for ConsumerStatus { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut debug = f.debug_struct("ConsumerStatus"); if let Some(inner) = self.try_lock() { debug.field("state", &inner.state()); } debug.finish() } } #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum ConsumerState { Active, ActiveWithDelegate, Canceling, Canceled, } impl ConsumerState { pub fn is_active(self) -> bool { match self { ConsumerState::Active | ConsumerState::ActiveWithDelegate => true, _ => false, } } } impl Default for ConsumerState { fn default() -> Self { Self::Active } } #[derive(Default)] pub(crate) struct ConsumerStatusInner(ConsumerState); impl ConsumerStatusInner { pub(crate) fn state(&self) -> ConsumerState { self.0 } pub(crate) fn set_delegate(&mut self) { if self.0 == ConsumerState::Active { self.0 = ConsumerState::ActiveWithDelegate; } } pub(crate) fn start_cancel(&mut self) { self.0 = ConsumerState::Canceling; } pub(crate) fn cancel(&mut self) { self.0 = ConsumerState::Canceled; } }