use std::time::Duration;
use bevy::utils::HashMap;
use serde::{Deserialize, Serialize};
use crate::bindings::InputBinding;
use crate::config::input_config::InputConfig;
use crate::config::DurationInMillis;
use crate::input_action::InputAction;
use crate::phantom::{IAWrp, IBWrp};
#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq)]
pub struct InputConfigBuilder {
double_click_timing: Option<DurationInMillis>,
post_acceptance_delay: Option<DurationInMillis>,
bindings: HashMap<String, HashMap<String, Vec<InputBinding>>>,
}
impl InputConfigBuilder {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn double_click_timing(mut self, double_click_timing: Duration) -> Self {
self.double_click_timing = Some(double_click_timing.as_millis() as u64);
self
}
#[must_use]
pub fn post_acceptance_delay(mut self, post_acceptance_delay: Duration) -> Self {
self.post_acceptance_delay = Some(post_acceptance_delay.as_millis() as u64);
self
}
#[must_use]
pub fn bind<I: InputAction, Kind>(
mut self,
action: IAWrp<I, Kind>,
binding: IBWrp<Kind>,
) -> Self {
let group = self.bindings.entry(I::group_id().to_string()).or_default();
let bindings = group.entry(action.0.action_id().to_string()).or_default();
bindings.push(binding.0);
self
}
#[must_use]
pub fn build(&self) -> InputConfig {
InputConfig {
bindings: self.bindings.clone(),
double_click_timing: self.double_click_timing,
post_acceptance_delay: self.post_acceptance_delay,
}
}
}