From 747da41fd3f192038c2e3194b4de041f7969f7a8 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 10 Nov 2021 13:14:44 -0500 Subject: simplify --- src/state.rs | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/state.rs (limited to 'src/state.rs') diff --git a/src/state.rs b/src/state.rs new file mode 100644 index 0000000..b979ed7 --- /dev/null +++ b/src/state.rs @@ -0,0 +1,83 @@ +use textmode::Textmode as _; + +pub struct State { + readline: crate::readline::Readline, + history: crate::history::History, + focus: Focus, +} + +impl State { + pub fn new(actions: async_std::channel::Sender) -> Self { + let readline = crate::readline::Readline::new(actions.clone()); + let history = crate::history::History::new(actions); + let focus = Focus::Readline; + Self { + readline, + history, + focus, + } + } + + pub async fn render( + &self, + out: &mut textmode::Output, + ) -> anyhow::Result<()> { + out.clear(); + if let Focus::Readline = self.focus { + self.history.render(out, self.readline.lines()).await?; + self.readline.render(out).await?; + } else { + self.history.render(out, 0).await?; + } + out.refresh().await?; + Ok(()) + } + + pub async fn handle_action( + &mut self, + action: Action, + output: &mut textmode::Output, + ) { + match action { + Action::Render => { + self.render(output).await.unwrap(); + } + Action::Run(ref cmd) => { + self.history.run(cmd).await.unwrap(); + } + Action::UpdateFocus(new_focus) => { + self.focus = new_focus; + self.render(output).await.unwrap(); + } + } + } + + pub async fn handle_input(&mut self, key: Option) -> bool { + if let Some(key) = key { + let quit = match self.focus { + Focus::Readline => self.readline.handle_key(key).await, + Focus::History(idx) => { + self.history.handle_key(key, idx).await + } + }; + if quit { + return true; + } + } else { + return true; + } + false + } +} + +#[derive(Copy, Clone)] +pub enum Focus { + Readline, + History(usize), +} + +pub enum Action { + Render, + Run(String), + UpdateFocus(Focus), +} -- cgit v1.2.3-54-g00ecf