use {
reovim_driver_session::{
ExtensionMap, SessionExtension,
bridges::{ExtensionScope, ExtensionStateBridge},
},
reovim_kernel::api::v1::BufferId,
};
pub const KIND: &str = "yank-flash";
#[derive(Debug)]
pub struct YankFlashState {
pub buffer_id: BufferId,
pub start_line: usize,
pub end_line: usize,
pub start_col: usize,
pub end_col: usize,
pub is_linewise: bool,
pub sequence: u64,
}
impl YankFlashState {
pub const fn record(
&mut self,
buffer_id: BufferId,
start_line: usize,
start_col: usize,
end_line: usize,
end_col: usize,
is_linewise: bool,
) {
self.buffer_id = buffer_id;
self.start_line = start_line;
self.end_line = end_line;
self.start_col = start_col;
self.end_col = end_col;
self.is_linewise = is_linewise;
self.sequence += 1;
}
}
impl SessionExtension for YankFlashState {
fn create() -> Self {
Self {
buffer_id: BufferId::from_raw(0),
start_line: 0,
end_line: 0,
start_col: 0,
end_col: 0,
is_linewise: false,
sequence: 0,
}
}
}
pub struct YankFlashBridge;
impl ExtensionStateBridge for YankFlashBridge {
fn kind(&self) -> &'static str {
KIND
}
fn scope(&self) -> ExtensionScope {
ExtensionScope::Client
}
fn snapshot(&self, extensions: &ExtensionMap) -> Option<serde_json::Value> {
let state = extensions.get::<YankFlashState>()?;
if state.sequence == 0 {
return None;
}
Some(serde_json::json!({
"bufferId": state.buffer_id.as_usize(),
"startLine": state.start_line,
"endLine": state.end_line,
"startCol": state.start_col,
"endCol": state.end_col,
"isLinewise": state.is_linewise,
"sequence": state.sequence,
}))
}
fn is_active(&self, extensions: &ExtensionMap) -> bool {
extensions
.get::<YankFlashState>()
.is_some_and(|s| s.sequence > 0)
}
}
#[cfg(test)]
#[path = "tests/yank_flash.rs"]
mod tests;