use crate::battle::BattleRules;
#[cfg(feature = "serialization")]
use crate::error::{WeaselError, WeaselResult};
#[cfg(feature = "serialization")]
use crate::event::Event;
#[cfg(feature = "serialization")]
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
use std::hash::Hash;
pub type UserEventId = u16;
pub trait UserRules<R: BattleRules> {
type UserMetricId: Eq + Hash + Clone + Debug + Send;
#[cfg(feature = "serialization")]
type UserEventPackage: UserEventPacker<R>;
}
pub type UserMetricId<R> = <<R as BattleRules>::UR as UserRules<R>>::UserMetricId;
#[cfg(feature = "serialization")]
pub type UserEventPackage<R> = <<R as BattleRules>::UR as UserRules<R>>::UserEventPackage;
#[cfg(feature = "serialization")]
pub trait UserEventPacker<R>: Serialize + for<'a> Deserialize<'a>
where
R: BattleRules,
{
fn boxed(self) -> WeaselResult<Box<dyn Event<R> + Send>, R>;
fn flattened(event: Box<dyn Event<R> + Send>) -> WeaselResult<Self, R>;
}
#[cfg(feature = "serialization")]
impl<R> UserEventPacker<R> for ()
where
R: BattleRules,
{
fn boxed(self) -> WeaselResult<Box<dyn Event<R> + Send>, R> {
Err(WeaselError::UserEventUnpackingError(
"empty UserEventPacker".into(),
))
}
fn flattened(event: Box<dyn Event<R> + Send>) -> WeaselResult<Self, R> {
Err(WeaselError::UserEventPackingError(
event.clone(),
"empty UserEventPacker".into(),
))
}
}
#[cfg(feature = "serialization")]
#[cfg(test)]
mod tests {
use super::*;
use crate::event::{DummyEvent, EventTrigger};
use crate::{battle_rules, rules::empty::*};
#[test]
fn empty_user_event_packer() {
battle_rules! {}
let result: WeaselResult<_, CustomRules> = ().boxed();
assert!(result.is_err());
let dummy = DummyEvent::<CustomRules>::trigger(&mut ()).event();
let result: WeaselResult<_, CustomRules> = <()>::flattened(dummy);
assert!(result.is_err());
}
}