quicksilver 0.1.0

A simple game framework for 2D games in pure Rust
Documentation
use input::{ButtonState, Key};
use std::ops::Index;

#[derive(Copy)]
///A structure that stores each key's state
pub struct Keyboard {
    pub(crate) keys: [ButtonState; 256],
}

impl Keyboard {
    pub(crate) fn process_event(&mut self, keycode: usize, pressed: bool) {
        let previous_state = self.keys[keycode];
        self.keys[keycode] = if pressed {
            if previous_state.is_down() {
                ButtonState::Held
            } else {
                ButtonState::Pressed
            }
        } else {
            if previous_state.is_down() {
                ButtonState::Released
            } else {
                ButtonState::NotPressed
            }
        };
    }

    pub(crate) fn clear_temporary_states(&mut self) {
        for index in 0..self.keys.len() {
            self.keys[index] = self.keys[index].clear_temporary();
        }
    }
}

impl Clone for Keyboard {
    fn clone(&self) -> Keyboard {
        *self
    }
}

impl Index<Key> for Keyboard {
    type Output = ButtonState;

    fn index(&self, index: Key) -> &ButtonState {
        &self.keys[index as usize]
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn keypress() {
        let mut keyboard = Keyboard {
            keys: [ButtonState::NotPressed; 256]
        };
        keyboard.process_event(Key::A as usize, true);
        assert_eq!(keyboard[Key::A], ButtonState::Pressed);
        keyboard.process_event(Key::A as usize, true);
        assert_eq!(keyboard[Key::A], ButtonState::Held);
        keyboard.process_event(Key::A as usize, false);
        assert_eq!(keyboard[Key::A], ButtonState::Released);
        keyboard.process_event(Key::A as usize, false);
        assert_eq!(keyboard[Key::A], ButtonState::NotPressed);
    }

    #[test]
    fn clear_states() {
        let mut keyboard = Keyboard {
            keys: [ButtonState::NotPressed; 256].clone()
        };
        keyboard.process_event(Key::A as usize, true);
        keyboard.clear_temporary_states();
        assert_eq!(keyboard[Key::A], ButtonState::Held);
        keyboard.process_event(Key::A as usize, false);
        keyboard.clear_temporary_states();
        assert_eq!(keyboard[Key::A], ButtonState::NotPressed);
    }
}