use crate::ecs::events::{
command::CommandRequested,
cursor::CursorMoveRequested,
edit::{BufferEditRequested, EditHistoryRequested},
intent::ViewportIntent,
status::StatusMessageRequested,
};
use bevy::prelude::MessageWriter;
#[derive(Clone, Debug, Eq, PartialEq)]
pub(super) enum VimEffect {
BufferEdit(BufferEditRequested),
EditHistory(EditHistoryRequested),
CursorMove(CursorMoveRequested),
Viewport(ViewportIntent),
Status(StatusMessageRequested),
Command(CommandRequested),
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub(super) struct VimEffectBatch {
effects: Vec<VimEffect>,
}
impl VimEffectBatch {
pub(super) fn push(&mut self, effect: VimEffect) {
self.effects.push(effect);
}
pub(super) fn extend(&mut self, effects: impl IntoIterator<Item = VimEffect>) {
self.effects.extend(effects);
}
pub(super) fn as_slice(&self) -> &[VimEffect] {
&self.effects
}
}
#[derive(bevy::ecs::system::SystemParam)]
pub struct VimEffectWriters<'w> {
buffer_edits: MessageWriter<'w, BufferEditRequested>,
edit_history: MessageWriter<'w, EditHistoryRequested>,
cursor_moves: MessageWriter<'w, CursorMoveRequested>,
viewport_intents: MessageWriter<'w, ViewportIntent>,
status_requests: MessageWriter<'w, StatusMessageRequested>,
command_requests: MessageWriter<'w, CommandRequested>,
}
impl VimEffectWriters<'_> {
pub(super) fn emit(&mut self, effects: &VimEffectBatch) {
for effect in effects.as_slice() {
match effect {
VimEffect::BufferEdit(request) => {
let _sent = self.buffer_edits.write(request.clone());
}
VimEffect::EditHistory(request) => {
let _sent = self.edit_history.write(*request);
}
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);
}
}
}
}
}