diff --git a/.gitignore b/.gitignore index 87270ee..086183e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target result/ +*.json diff --git a/Cargo.lock b/Cargo.lock index 0991c97..e096f7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,6 +193,9 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "block-buffer" @@ -428,6 +431,7 @@ dependencies = [ "mio", "parking_lot", "rustix", + "serde", "signal-hook", "signal-hook-mio", "winapi", @@ -1441,9 +1445,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -1484,6 +1488,7 @@ dependencies = [ "futures", "ironcalc", "ratatui", + "serde_json", "slice-utils", "thiserror", "tui-popup", diff --git a/Cargo.toml b/Cargo.toml index 426a38b..d337a2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] anyhow = { version = "1.0.91", features = ["backtrace"] } clap = { version = "4.5.20", features = ["derive"] } -crossterm = { version = "0.28.1", features = ["event-stream"] } +crossterm = { version = "0.28.1", features = ["event-stream", "serde"] } csvx = "0.1.17" ironcalc = { git = "https://github.com/ironcalc/IronCalc" } futures = "0.3.31" @@ -18,3 +18,4 @@ tui-textarea = "0.7.0" tui-prompts = "0.5.0" slice-utils = { git = "https://dev.zaphar.net/zaphar/slice-cursor-rs.git", ref = "main" } tui-popup = "0.6.0" +serde_json = "1.0.133" diff --git a/src/main.rs b/src/main.rs index 200e3c6..cd6b9ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,9 @@ use std::{path::PathBuf, process::ExitCode}; use clap::Parser; use crossterm::event; use ratatui; +use serde_json::to_writer; +use std::io::Write; + use ui::Workspace; mod book; @@ -17,14 +20,33 @@ pub struct Args { locale_name: String, #[arg(default_value_t=String::from("America/New_York"), short, long)] timezone_name: String, + #[arg(long)] + log_input: Option, } +type ReadFn = Box anyhow::Result>; + fn run(terminal: &mut ratatui::DefaultTerminal, args: Args) -> anyhow::Result { let mut ws = Workspace::load(&args.workbook, &args.locale_name, &args.timezone_name)?; - + let mut read_func: ReadFn = if let Some(log_path) = args.log_input { + { + let log_file = std::fs::File::create(log_path)?; + Box::new(move || { + let evt = event::read()?; + to_writer(&log_file, &evt)?; + writeln!(&log_file, "")?; + Ok(evt) + }) + } + } else { + Box::new(|| { + let evt = event::read()?; + Ok(evt) + }) + }; loop { terminal.draw(|frame| ui::render::draw(frame, &mut ws))?; - if let Some(code) = ws.handle_input(event::read()?)? { + if let Some(code) = ws.handle_input(read_func()?)? { return Ok(code); } }