alma 0.1.1

A Bevy-native modal text editor with Vim-style navigation.
Documentation
//! Vim mode state.

use bevy::prelude::Resource;

use super::InsertState;

/// High-level editing mode for the Vim controller.
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Resource)]
pub enum VimMode {
    /// Normal-mode navigation and command composition.
    #[default]
    Normal,
    /// Insert-mode text entry.
    Insert(InsertState),
    /// Visual-mode selection behavior.
    Visual(VisualMode),
}

impl VimMode {
    /// Returns whether this mode is insert-like.
    #[must_use]
    pub const fn is_insert(self) -> bool {
        matches!(self, Self::Insert(_))
    }
}

/// Supported visual selection variants.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum VisualMode {
    /// Character-wise visual selection.
    Characterwise,
    /// Whole-line visual selection.
    Linewise,
    /// Rectangular visual selection by screen column.
    Blockwise,
}

#[cfg(test)]
mod tests {
    use super::VimMode;
    use crate::vim::{InsertExitPolicy, InsertState};

    #[test]
    fn insert_mode_carries_insert_state() {
        let state = InsertState::new(InsertExitPolicy::KeepCursor);

        assert_eq!(VimMode::Insert(state), VimMode::Insert(state));
        assert!(VimMode::Insert(state).is_insert());
        assert!(!VimMode::Normal.is_insert());
    }
}