use crate::context::ResourceContext;
use async_trait::async_trait;
use super::types::{Connection, RoomId};
#[async_trait]
pub trait DungeonHook: Send + Sync {
async fn validate_room_move(
&self,
_current_room: &RoomId,
_target_room: &RoomId,
_resources: &ResourceContext,
) -> Result<(), String> {
Ok(())
}
async fn on_room_entered(
&self,
_room_id: &RoomId,
_is_first_visit: bool,
_resources: &mut ResourceContext,
) {
}
async fn on_floor_advanced(&self, _new_floor: u32, _resources: &mut ResourceContext) {
}
async fn on_connection_unlocked(
&self,
_connection: &Connection,
_resources: &mut ResourceContext,
) {
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct DefaultDungeonHook;
#[async_trait]
impl DungeonHook for DefaultDungeonHook {
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook_does_nothing() {
let hook = DefaultDungeonHook;
let room1 = RoomId::new(1, 1);
let room2 = RoomId::new(1, 2);
let connection = Connection::new(room1.clone(), room2.clone());
let resources = ResourceContext::new();
let result = hook.validate_room_move(&room1, &room2, &resources).await;
assert!(result.is_ok());
let mut resources = ResourceContext::new();
hook.on_room_entered(&room2, true, &mut resources).await;
hook.on_floor_advanced(2, &mut resources).await;
hook.on_connection_unlocked(&connection, &mut resources)
.await;
}
}