use super::{BuiltInTimePlugin, TimeConfig};
use crate::plugin::action::{ActionConfig, ActionPlugin};
use crate::plugin::{Plugin, PluginBuilder};
use async_trait::async_trait;
pub struct TurnBasedTimePlugin {
time_plugin: BuiltInTimePlugin,
action_plugin: ActionPlugin,
}
impl TurnBasedTimePlugin {
pub fn new(initial_day: u32, actions_per_day: u32) -> Self {
Self {
time_plugin: BuiltInTimePlugin::new(TimeConfig {
initial_day,
actions_per_day, }),
action_plugin: ActionPlugin::new(ActionConfig {
max_per_period: actions_per_day,
}),
}
}
pub fn with_defaults() -> Self {
Self::new(1, 3)
}
}
impl Default for TurnBasedTimePlugin {
fn default() -> Self {
Self::with_defaults()
}
}
#[async_trait]
impl Plugin for TurnBasedTimePlugin {
fn name(&self) -> &'static str {
"issun:turn_based_time"
}
fn build(&self, builder: &mut dyn PluginBuilder) {
self.time_plugin.build(builder);
self.action_plugin.build(builder);
}
fn dependencies(&self) -> Vec<&'static str> {
vec![]
}
async fn initialize(&mut self) {
self.time_plugin.initialize().await;
self.action_plugin.initialize().await;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_plugin_name() {
let plugin = TurnBasedTimePlugin::default();
assert_eq!(plugin.name(), "issun:turn_based_time");
}
#[test]
fn test_plugin_with_custom_config() {
let plugin = TurnBasedTimePlugin::new(10, 5);
assert_eq!(plugin.name(), "issun:turn_based_time");
}
#[test]
fn test_plugin_default() {
let plugin = TurnBasedTimePlugin::default();
assert_eq!(plugin.name(), "issun:turn_based_time");
}
#[test]
fn test_plugin_no_dependencies() {
let plugin = TurnBasedTimePlugin::default();
assert!(plugin.dependencies().is_empty());
}
}