summaryrefslogtreecommitdiffstats
path: root/src/nbsh.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/nbsh.rs')
-rw-r--r--src/nbsh.rs149
1 files changed, 0 insertions, 149 deletions
diff --git a/src/nbsh.rs b/src/nbsh.rs
deleted file mode 100644
index 84d35e3..0000000
--- a/src/nbsh.rs
+++ /dev/null
@@ -1,149 +0,0 @@
-use textmode::Textmode as _;
-
-pub async fn run() -> anyhow::Result<()> {
- let mut input = textmode::Input::new().await?;
- let mut output = textmode::Output::new().await?;
-
- // avoid the guards getting stuck in a task that doesn't run to
- // completion
- let _input_guard = input.take_raw_guard();
- let _output_guard = output.take_screen_guard();
-
- let (action_w, action_r) = async_std::channel::unbounded();
-
- let repl = async_std::sync::Arc::new(async_std::sync::Mutex::new(
- crate::repl::Repl::new(action_w.clone()),
- ));
- let history = async_std::sync::Arc::new(async_std::sync::Mutex::new(
- crate::history::History::new(action_w),
- ));
- let input_source = async_std::sync::Arc::new(
- async_std::sync::Mutex::new(InputSource::Repl),
- );
-
- render(
- &mut output,
- &*repl.lock_arc().await,
- &*history.lock_arc().await,
- &*input_source.lock_arc().await,
- )
- .await
- .unwrap();
-
- {
- let repl = async_std::sync::Arc::clone(&repl);
- let history = async_std::sync::Arc::clone(&history);
- let input_source = async_std::sync::Arc::clone(&input_source);
- async_std::task::spawn(async move {
- while let Ok(action) = action_r.recv().await {
- handle_action(
- action,
- &mut output,
- async_std::sync::Arc::clone(&repl),
- async_std::sync::Arc::clone(&history),
- async_std::sync::Arc::clone(&input_source),
- )
- .await;
- }
- });
- }
-
- loop {
- let quit = handle_input(
- &mut input,
- async_std::sync::Arc::clone(&repl),
- async_std::sync::Arc::clone(&history),
- async_std::sync::Arc::clone(&input_source),
- )
- .await;
- if quit {
- break;
- }
- }
-
- Ok(())
-}
-
-async fn handle_action(
- action: Action,
- output: &mut textmode::Output,
- repl: async_std::sync::Arc<async_std::sync::Mutex<crate::repl::Repl>>,
- history: async_std::sync::Arc<
- async_std::sync::Mutex<crate::history::History>,
- >,
- input_source: async_std::sync::Arc<async_std::sync::Mutex<InputSource>>,
-) {
- match action {
- Action::Render => {
- render(
- output,
- &*repl.lock_arc().await,
- &*history.lock_arc().await,
- &*input_source.lock_arc().await,
- )
- .await
- .unwrap();
- }
- Action::Run(ref cmd) => {
- history.lock_arc().await.run(cmd).await.unwrap();
- }
- Action::UpdateFocus(new_input_source) => {
- *input_source.lock_arc().await = new_input_source;
- }
- }
-}
-
-async fn handle_input(
- input: &mut textmode::Input,
- repl: async_std::sync::Arc<async_std::sync::Mutex<crate::repl::Repl>>,
- history: async_std::sync::Arc<
- async_std::sync::Mutex<crate::history::History>,
- >,
- input_source: async_std::sync::Arc<async_std::sync::Mutex<InputSource>>,
-) -> bool {
- let key = input.read_key().await.unwrap();
- if let Some(key) = key {
- let input_source = *input_source.lock_arc().await;
- let quit = match input_source {
- InputSource::Repl => repl.lock_arc().await.handle_key(key).await,
- InputSource::History(idx) => {
- history.lock_arc().await.handle_key(key, idx).await
- }
- };
- if quit {
- return true;
- }
- } else {
- return true;
- }
- false
-}
-
-async fn render(
- out: &mut textmode::Output,
- repl: &crate::repl::Repl,
- history: &crate::history::History,
- input_source: &InputSource,
-) -> anyhow::Result<()> {
- out.clear();
- if let InputSource::Repl = input_source {
- history.render(out, repl.lines()).await?;
- repl.render(out).await?;
- } else {
- history.render(out, 0).await?;
- }
- out.refresh().await?;
- Ok(())
-}
-
-#[derive(Copy, Clone, Debug)]
-pub enum InputSource {
- Repl,
- History(usize),
-}
-
-pub enum Action {
- Render,
- Run(String),
- UpdateFocus(InputSource),
-}