Save history in localStorage.

This commit is contained in:
Condorra 2024-09-19 22:15:57 +10:00
parent 8816d76c53
commit f79d092c5c
2 changed files with 27 additions and 1 deletions

View File

@ -1,5 +1,8 @@
use std::collections::VecDeque; use std::collections::VecDeque;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
pub struct History { pub struct History {
pub entries: VecDeque<String>, pub entries: VecDeque<String>,
pub max_size: usize, pub max_size: usize,

View File

@ -490,9 +490,20 @@ impl Write for WritetermFunction {
impl Readline { impl Readline {
pub fn new(prompt: String, write_fn: Box<dyn FnMut(&[u8])>, term_size: (u16, u16)) -> Self { pub fn new(prompt: String, write_fn: Box<dyn FnMut(&[u8])>, 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 { Self {
term: TerminalState::new(), term: TerminalState::new(),
line_state: LineState::new(prompt, term_size), line_state,
write_term: WritetermFunction { f: write_fn }, write_term: WritetermFunction { f: write_fn },
} }
} }
@ -508,9 +519,21 @@ impl Readline {
pub fn readline(&mut self, input: &[u8]) -> Result<Vec<ReadlineEvent>, ReadlineError> { pub fn readline(&mut self, input: &[u8]) -> Result<Vec<ReadlineEvent>, ReadlineError> {
let evs = self.term.events_for_input(input)?; let evs = self.term.events_for_input(input)?;
let mut results: Vec<ReadlineEvent> = Vec::new(); let mut results: Vec<ReadlineEvent> = Vec::new();
for ev in evs { for ev in evs {
results.extend(self.line_state.handle_event(ev, &mut self.write_term)?); 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) Ok(results)
} }
} }