alma 0.1.0

A Bevy-native modal text editor with Vim-style navigation.
Documentation
//! Vim adapter effects.

use crate::ecs::events::{
    command::CommandRequested, cursor::CursorMoveRequested, intent::ViewportIntent,
    status::StatusMessageRequested,
};
use bevy::prelude::MessageWriter;

/// ECS requests collected during Vim interpretation.
#[derive(Clone, Debug, Eq, PartialEq)]
pub(super) enum VimEffect {
    /// Cursor move.
    CursorMove(CursorMoveRequested),
    /// Viewport placement.
    Viewport(ViewportIntent),
    /// Status update.
    Status(StatusMessageRequested),
    /// Command request.
    Command(CommandRequested),
}

/// Vim effect sinks.
#[derive(bevy::ecs::system::SystemParam)]
pub struct VimEffectWriters<'w> {
    /// Cursor moves.
    cursor_moves: MessageWriter<'w, CursorMoveRequested>,
    /// Viewport intents.
    viewport_intents: MessageWriter<'w, ViewportIntent>,
    /// Status requests.
    status_requests: MessageWriter<'w, StatusMessageRequested>,
    /// Command requests.
    command_requests: MessageWriter<'w, CommandRequested>,
}

impl VimEffectWriters<'_> {
    /// Emits collected effects.
    pub(super) fn emit(&mut self, effects: &[VimEffect]) {
        for effect in effects {
            match effect {
                VimEffect::CursorMove(request) => {
                    let _sent = self.cursor_moves.write(*request);
                }
                VimEffect::Viewport(intent) => {
                    let _sent = self.viewport_intents.write(*intent);
                }
                VimEffect::Status(request) => {
                    let _sent = self.status_requests.write(request.clone());
                }
                VimEffect::Command(request) => {
                    let _sent = self.command_requests.write(*request);
                }
            }
        }
    }
}