use crate::actions::Execute;
use crate::{EditorState, Index2, Lines};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui_core::backend::Backend;
use ratatui_core::terminal::Terminal;
use std::io::{stdout, Result};
#[derive(Clone, Debug)]
pub struct OpenSystemEditor;
impl Execute for OpenSystemEditor {
fn execute(&mut self, state: &mut EditorState) {
state.system_edit_requested = true;
}
}
pub fn open<B: Backend>(state: &mut EditorState, terminal: &mut Terminal<B>) -> Result<()> {
if !std::mem::take(&mut state.system_edit_requested) {
return Ok(());
}
state.capture();
let content = state.lines.to_string();
disable_raw_mode()?;
crossterm::execute!(stdout(), LeaveAlternateScreen)?;
let result = edit::edit(&content);
crossterm::execute!(stdout(), EnterAlternateScreen)?;
enable_raw_mode()?;
let _ = terminal.clear();
let edited = result.map_err(std::io::Error::other)?;
state.lines = Lines::from(edited.trim_end_matches('\n'));
state.cursor = Index2::new(0, 0);
state.selection = None;
Ok(())
}
#[must_use]
pub fn is_pending(state: &EditorState) -> bool {
state.system_edit_requested
}