keybee 0.0.0

Semantic input library for games
Documentation
use std::collections::HashMap;

use crate::buttons::{Axis1d, Axis2d, Button};

#[derive(Debug)]
pub struct Bindings {
    pub action_sets: HashMap<String, ActionSetBindings>,
}

impl Bindings {
    pub fn empty() -> Self {
        Self {
            action_sets: HashMap::new(),
        }
    }

    pub fn new<A, Name>(action_sets: A) -> Self
    where
        A: IntoIterator<Item = (Name, ActionSetBindings)>,
        Name: Into<String>,
    {
        let action_sets = action_sets
            .into_iter()
            .map(|(key, value)| (key.into(), value))
            .collect();

        Self { action_sets }
    }

    pub fn merge(&mut self, other: Bindings) {
        for (name, action_set) in other.action_sets {
            let bindings = self
                .action_sets
                .entry(name)
                .or_insert_with(ActionSetBindings::empty);
            bindings.merge(action_set);
        }
    }

    pub fn clear(&mut self) {
        self.action_sets.clear();
    }
}

#[derive(Debug)]
pub struct ActionSetBindings {
    pub actions: HashMap<String, Vec<Binding>>,
}

impl ActionSetBindings {
    pub fn empty() -> Self {
        Self {
            actions: HashMap::new(),
        }
    }

    pub fn new<A, N, Bs, B>(actions: A) -> Self
    where
        A: IntoIterator<Item = (N, Bs)>,
        N: Into<String>,
        Bs: IntoIterator<Item = B>,
        B: Into<Binding>,
    {
        let actions = actions
            .into_iter()
            .map(|(key, value)| (key.into(), value.into_iter().map(Into::into).collect()))
            .collect();

        Self { actions }
    }

    pub fn merge(&mut self, other: ActionSetBindings) {
        for (name, action) in other.actions {
            self.actions.insert(name, action);
        }
    }
}

#[derive(Debug, Clone, Copy)]
pub enum Binding {
    Button(Button),
    Axis1d(Axis1dBinding),
    Axis2d(Axis2dBinding),
    Axis3d(Axis3dBinding),
}

#[derive(Debug, Clone, Copy)]
pub enum Axis1dBinding {
    Buttons {
        neg: Button,
        pos: Button,
        sensitivity: f32,
    },
    Axis {
        axis: Axis1d,
        sensitivity: f32,
    },
}

#[derive(Debug, Clone, Copy)]
pub enum Axis2dBinding {
    Individual { x: Axis1dBinding, y: Axis1dBinding },
    Axis { axis: Axis2d, sensitivity: f32 },
}

#[derive(Debug, Clone, Copy)]
pub enum Axis3dBinding {
    Individual {
        x: Axis1dBinding,
        y: Axis1dBinding,
        z: Axis1dBinding,
    },
}