summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs53
1 files changed, 39 insertions, 14 deletions
diff --git a/src/main.rs b/src/main.rs
index d0c07e9..1753688 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,14 +2,13 @@
 use crate::types::*;
 use smol::prelude::*;
 
-use smol::Timer;
 use smol::fs::File;
 use smol::lock::RwLock;
 use std::path::PathBuf;
 use std::process::ExitCode;
 use std::ops::Range;
-use std::time::Duration;
 
+mod encoding;
 mod terminal;
 mod types;
 
@@ -50,24 +49,39 @@ impl Ivy {
   }
 
   async fn run(mut self) -> Result<()> {
+    /* The awkward structure here is because it's important that cleanup still
+     * happen even if something fails in the middle.
+     */
     let mut error = None;
 
-    error = error.or(self.init_arguments().await.err());
-    error = error.or(self.init_editor().await.err());
+    error = error.or(self.init().await.err());
+    error = error.or(self.interact().await.err());
+    error = error.or(self.zap().await.err());
 
-    error = error.or(self.terminal.write().await
-                         .init_termios().await.err());
-    error = error.or(self.terminal.write().await
-                         .init_full_screen().await.err());
+    if let Some(error) = error {
+      Err(error)
+    } else {
+      Ok(())
+    }
+  }
 
-    error = error.or(self.draw().await.err());
+  async fn init(&mut self) -> Result<()> {
+    self.init_arguments().await?;
+    self.init_editor().await?;
 
-    Timer::after(Duration::from_millis(1000)).await;
+    self.terminal.write().await.init_termios().await?;
+    self.terminal.write().await.init_full_screen().await?;
 
-    error = error.or(self.terminal.write().await
-                         .zap_full_screen().await.err());
-    error = error.or(self.terminal.write().await
-                         .zap_termios().await.err());
+    Ok(())
+  }
+
+  async fn zap(&mut self) -> Result<()> {
+    let mut error = None;
+
+    error = error.or(
+        self.terminal.write().await.zap_full_screen().await.err());
+    error = error.or(
+        self.terminal.write().await.zap_termios().await.err());
 
     if let Some(error) = error {
       Err(error)
@@ -100,6 +114,17 @@ impl Ivy {
     Ok(())
   }
 
+  async fn interact(&mut self) -> Result<()> {
+    self.draw().await?;
+
+    loop {
+      let c = self.terminal.write().await.read_char().await;
+      println!("c {:?}", c);
+      smol::Timer::after(std::time::Duration::from_millis(1000)).await;
+      return Ok(());
+    }
+  }
+
   async fn draw(&mut self) -> Result<()> {
     let mut terminal = self.terminal.write().await;
     let buffer = self.buffer.read().await;