diff --git a/src/main.rs b/src/main.rs index 5aaeac4..0fa9f44 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,10 @@ -/// A simple terminal checklist application. +//! A simple terminal checklist application. mod event_source; mod terminal_guard; -/// UI components (todo list) mod todo_list; use anyhow::{Context as _, Result, anyhow, bail}; +use argh::FromArgs; use core::time::Duration; use crossterm::event::{self, EnableMouseCapture, Event, KeyCode}; use crossterm::execute; @@ -16,11 +16,14 @@ use ratatui::backend::CrosstermBackend; use std::io::{self, Read as _}; use terminal_guard::TerminalModeGuard; use todo_list::TodoList; -use argh::FromArgs; #[derive(FromArgs)] /// chkr - terminal checklist struct Args { + /// load checklist from file instead of stdin + #[argh(option, short = 'f', long = "file")] + file: Option, + /// print version and exit #[argh(switch, short = 'V', long = "version")] version: bool, @@ -34,13 +37,20 @@ fn main() -> Result<()> { return Ok(()); } - let mut input = String::new(); - io::stdin() - .read_to_string(&mut input) - .context("reading stdin")?; + let input: String = if let Some(path) = args.file { + std::fs::read_to_string(&path).with_context(|| format!("reading file {path}"))? + } else { + let mut input = String::new(); + io::stdin() + .read_to_string(&mut input) + .context("reading stdin")?; + input + }; if input.trim().is_empty() { - eprintln!("Provide text via stdin (pipe or heredoc). Example: \n cat file.txt | chkr"); + eprintln!( + "Provide text via stdin (pipe or heredoc), or use --file. Example: \n cat file.txt | chkr" + ); return Ok(()); }