diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 53 |
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; |