#[cfg(feature = "persistence")]
use crate::persistence::{schema_version::SchemaVersion, versioned::Versioned};
use crate::{ActorContext, ActorId};
#[cfg(feature = "persistence")]
use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
use std::error::Error;
pub trait Actor {
type Message;
type State;
type Error: Error;
fn init(&self, context: &ActorContext<Self::Message>) -> Result<Self::State, Self::Error>;
fn receive(
&self,
context: &ActorContext<Self::Message>,
incoming: Incoming<Self::Message>,
state: Self::State,
) -> Result<Control<Self::State>, Self::Error>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Nothing {}
#[cfg(feature = "persistence")]
impl Versioned for Nothing {
const MANIFEST: &'static str = "nothing";
const VERSION: SchemaVersion = SchemaVersion::new(0);
}
#[cfg(feature = "persistence")]
impl Serialize for Nothing {
fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match *self {}
}
}
#[cfg(feature = "persistence")]
impl<'de> Deserialize<'de> for Nothing {
fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Err(de::Error::custom(
"no value of the uninhabited type Nothing",
))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Incoming<M> {
Message(M),
Terminated(ActorId),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[must_use]
pub enum Control<S> {
Continue(S),
Stop,
}