mod activity_container;
mod lifecycle;
pub(crate) use activity_container::*;
pub use lifecycle::*;
use crate::nut::iac::{filter::SubscriptionFilter, managed_state::DomainId};
use crate::*;
use core::any::Any;
use std::ops::{Index, IndexMut};
pub trait Activity: Any {}
impl<T: Any> Activity for T {}
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
pub struct ActivityId<A> {
pub(crate) id: UncheckedActivityId,
pub(crate) domain_index: DomainId,
phantom: std::marker::PhantomData<A>,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
pub struct UncheckedActivityId {
pub(crate) index: usize,
}
impl<A: Activity> ActivityId<A> {
pub(crate) fn new(index: usize, domain_index: DomainId) -> Self {
Self {
id: UncheckedActivityId { index },
domain_index,
phantom: Default::default(),
}
}
pub fn on_enter<F>(&self, f: F)
where
F: Fn(&mut A) + 'static,
{
crate::nut::register_no_payload(*self, f, Topic::enter(), SubscriptionFilter::no_filter())
}
pub fn on_enter_domained<F>(&self, f: F)
where
F: Fn(&mut A, &mut DomainState) + 'static,
{
crate::nut::register_domained_no_payload(
*self,
f,
Topic::enter(),
SubscriptionFilter::no_filter(),
)
}
pub fn on_leave<F>(&self, f: F)
where
F: Fn(&mut A) + 'static,
{
crate::nut::register_no_payload(*self, f, Topic::leave(), SubscriptionFilter::no_filter())
}
pub fn on_leave_domained<F>(&self, f: F)
where
F: Fn(&mut A, &mut DomainState) + 'static,
{
crate::nut::register_domained_no_payload(
*self,
f,
Topic::leave(),
SubscriptionFilter::no_filter(),
)
}
pub fn on_delete<F>(&self, f: F)
where
F: FnOnce(A) + 'static,
{
crate::nut::register_on_delete(*self, f);
}
pub fn on_delete_domained<F>(&self, f: F)
where
F: FnOnce(A, &mut DomainState) + 'static,
{
crate::nut::register_domained_on_delete(*self, f);
}
pub fn subscribe<F, MSG>(&self, f: F)
where
F: Fn(&mut A, &MSG) + 'static,
MSG: Any,
{
crate::nut::register(*self, f, Default::default())
}
pub fn subscribe_mut<F, MSG>(&self, f: F)
where
F: Fn(&mut A, &mut MSG) + 'static,
MSG: Any,
{
crate::nut::register_mut(*self, f, Default::default())
}
pub fn subscribe_domained<F, MSG>(&self, f: F)
where
F: Fn(&mut A, &mut DomainState, &MSG) + 'static,
MSG: Any,
{
crate::nut::register_domained(*self, f, Default::default())
}
pub fn subscribe_domained_mut<F, MSG>(&self, f: F)
where
F: Fn(&mut A, &mut DomainState, &mut MSG) + 'static,
MSG: Any,
{
crate::nut::register_domained_mut(*self, f, Default::default())
}
pub fn private_channel<F, MSG>(&self, f: F)
where
F: Fn(&mut A, MSG) + 'static,
MSG: Any,
{
crate::nut::register_owned(*self, f, Default::default())
}
pub fn private_domained_channel<F, MSG>(&self, f: F)
where
F: Fn(&mut A, &mut DomainState, MSG) + 'static,
MSG: Any,
{
crate::nut::register_domained_owned(*self, f, Default::default())
}
pub fn private_channel_masked<F, MSG>(&self, mask: SubscriptionFilter, f: F)
where
F: Fn(&mut A, MSG) + 'static,
MSG: Any,
{
crate::nut::register_owned(*self, f, mask)
}
pub fn private_domained_channel_masked<F, MSG>(&self, mask: SubscriptionFilter, f: F)
where
F: Fn(&mut A, &mut DomainState, MSG) + 'static,
MSG: Any,
{
crate::nut::register_domained_owned(*self, f, mask)
}
pub fn subscribe_masked<F, MSG>(&self, mask: SubscriptionFilter, f: F)
where
F: Fn(&mut A, &MSG) + 'static,
MSG: Any,
{
crate::nut::register(*self, f, mask)
}
pub fn subscribe_masked_mut<F, MSG>(&self, mask: SubscriptionFilter, f: F)
where
F: Fn(&mut A, &mut MSG) + 'static,
MSG: Any,
{
crate::nut::register_mut(*self, f, mask)
}
pub fn subscribe_domained_masked<F, MSG>(&self, mask: SubscriptionFilter, f: F)
where
F: Fn(&mut A, &mut DomainState, &MSG) + 'static,
MSG: Any,
{
crate::nut::register_domained(*self, f, mask)
}
pub fn subscribe_domained_masked_mut<F, MSG>(&self, mask: SubscriptionFilter, f: F)
where
F: Fn(&mut A, &mut DomainState, &mut MSG) + 'static,
MSG: Any,
{
crate::nut::register_domained_mut(*self, f, mask)
}
pub fn set_status(&self, status: LifecycleStatus) {
crate::nut::set_status((*self).into(), status);
}
pub fn private_message<MSG: Any>(&self, msg: MSG) {
let id: UncheckedActivityId = (*self).into();
id.private_message(msg);
}
}
impl UncheckedActivityId {
pub fn set_status(&self, status: LifecycleStatus) {
crate::nut::set_status(*self, status);
}
pub fn private_message<A: Any>(&self, msg: A) {
nut::send_custom_by_id(msg, *self)
}
pub fn as_usize(&self) -> usize {
self.index
}
pub fn forge_from_usize(index: usize) -> Self {
Self { index }
}
}
impl<A> Copy for ActivityId<A> {}
impl<A> Clone for ActivityId<A> {
fn clone(&self) -> Self {
*self
}
}
impl<A> Into<UncheckedActivityId> for ActivityId<A> {
fn into(self) -> UncheckedActivityId {
self.id
}
}