completeq_rs/
user_event.rs

1use std::{
2    fmt::Display,
3    hash::Hash,
4    marker::PhantomData,
5    sync::{
6        atomic::{AtomicUsize, Ordering},
7        Arc,
8    },
9};
10
11/// User-defined event type `MUST` implement this trait.
12pub trait UserEvent: Default {
13    /// Event id
14    /// [`crate::channel::CompleteQ`] use this id to track event message.
15    type ID: ?Sized + Hash + Eq + Send + Sync + Clone + 'static + Display;
16    /// Event message payload structure.
17    type Argument: Sized + Send + 'static;
18}
19
20/// Generally if user-defined event system do not care about event id's semantics,
21/// `CAN` implement this trait to reduce usage complexity
22pub trait AutoIncEvent: UserEvent {
23    /// Generate a new event id
24    fn next(&mut self) -> Self::ID;
25}
26
27#[derive(Clone)]
28/// user-defined event for `RPC` like system.
29pub struct RPCResponser<Argument>(Arc<AtomicUsize>, PhantomData<Argument>);
30
31impl<Argument> Default for RPCResponser<Argument> {
32    fn default() -> Self {
33        Self(Arc::new(AtomicUsize::new(1)), PhantomData)
34    }
35}
36
37impl<Argument> UserEvent for RPCResponser<Argument>
38where
39    Argument: Sized + Send + 'static,
40{
41    type ID = usize;
42    type Argument = Argument;
43}
44
45impl<Argument> AutoIncEvent for RPCResponser<Argument>
46where
47    Argument: Sized + Send + 'static,
48{
49    fn next(&mut self) -> Self::ID {
50        self.0.fetch_add(1, Ordering::SeqCst)
51    }
52}