use std::path::PathBuf;
use std::sync::{Arc, RwLock};
use nu_ansi_term::{Color, Style};
use reedline::{
default_emacs_keybindings, ColumnarMenu, DefaultHinter, Emacs, KeyCode, KeyModifiers,
MenuBuilder, Reedline, ReedlineEvent, ReedlineMenu,
};
use crate::cli::completer::JarvishCompleter;
use crate::cli::highlighter::JarvisHighlighter;
use crate::engine::classifier::InputClassifier;
use crate::storage::BlackBoxHistory;
pub fn build_editor(
classifier: Arc<InputClassifier>,
db_path: PathBuf,
session_id: i64,
git_branch_commands: Arc<RwLock<Vec<String>>>,
) -> (Reedline, bool) {
let completer = Box::new(JarvishCompleter::new(git_branch_commands));
let completion_menu = Box::new(ColumnarMenu::default().with_name("completion_menu"));
let mut keybindings = default_emacs_keybindings();
keybindings.add_binding(
KeyModifiers::NONE,
KeyCode::Tab,
ReedlineEvent::UntilFound(vec![
ReedlineEvent::Menu("completion_menu".to_string()),
ReedlineEvent::MenuNext,
]),
);
let mut editor = Reedline::create()
.with_highlighter(Box::new(JarvisHighlighter::new(classifier)))
.with_completer(completer)
.with_menu(ReedlineMenu::EngineCompleter(completion_menu))
.with_edit_mode(Box::new(Emacs::new(keybindings)));
let history_available = match BlackBoxHistory::open(db_path, session_id) {
Ok(history) => {
let hinter = Box::new(
DefaultHinter::default()
.with_style(Style::new().fg(Color::DarkGray))
.with_min_chars(2),
);
editor = editor.with_history(Box::new(history)).with_hinter(hinter);
true
}
Err(e) => {
eprintln!("jarvish: warning: failed to open history database: {e}");
false
}
};
(editor, history_available)
}