From f79d092c5cd6b2cd50903726b54f1eba43db3ead Mon Sep 17 00:00:00 2001 From: Condorra Date: Thu, 19 Sep 2024 22:15:57 +1000 Subject: [PATCH] Save history in localStorage. --- src/lineengine/history.rs | 3 +++ src/lineengine/line.rs | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/lineengine/history.rs b/src/lineengine/history.rs index e8454de..e2b1a65 100644 --- a/src/lineengine/history.rs +++ b/src/lineengine/history.rs @@ -1,5 +1,8 @@ use std::collections::VecDeque; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] pub struct History { pub entries: VecDeque, pub max_size: usize, diff --git a/src/lineengine/line.rs b/src/lineengine/line.rs index 9e59014..bbf55c9 100644 --- a/src/lineengine/line.rs +++ b/src/lineengine/line.rs @@ -490,9 +490,20 @@ impl Write for WritetermFunction { impl Readline { pub fn new(prompt: String, write_fn: Box, term_size: (u16, u16)) -> Self { + let mut line_state = LineState::new(prompt, term_size); + if let Some(existing_history) = web_sys::window().and_then(|w| { + w.local_storage() + .unwrap_or(None) + .and_then(|ls| ls.get("term_history").unwrap_or(None)) + }) { + if let Ok(history) = serde_json::from_str(&existing_history) { + line_state.history = history; + } + } + Self { term: TerminalState::new(), - line_state: LineState::new(prompt, term_size), + line_state, write_term: WritetermFunction { f: write_fn }, } } @@ -508,9 +519,21 @@ impl Readline { pub fn readline(&mut self, input: &[u8]) -> Result, ReadlineError> { let evs = self.term.events_for_input(input)?; let mut results: Vec = Vec::new(); + for ev in evs { results.extend(self.line_state.handle_event(ev, &mut self.write_term)?); } + + if !results.is_empty() { + if let Ok(json) = serde_json::to_string(&self.line_state.history) { + web_sys::window().and_then(|w| { + w.local_storage() + .unwrap_or(None) + .map(|ls| ls.set("term_history", &json)) + }); + } + } + Ok(results) } }