From 34a053cbe44989dc1d5b45434e11f64b317a4a2c Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 13 Dec 2021 18:59:44 +0000 Subject: [PATCH] Show single entries --- src/cli.rs | 9 ++++--- src/cli/error.rs | 15 ++++++++++++ src/cli/layout/line.rs | 4 ++- src/cli/show.rs | 55 ++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 ++- 5 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 src/cli/error.rs diff --git a/src/cli.rs b/src/cli.rs index e2027f8..981a9f2 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -8,6 +8,9 @@ use structopt::StructOpt; use crate::eval::{DateRange, EntryMode}; use crate::files::Files; +use self::error::Result; + +mod error; mod layout; mod show; @@ -26,6 +29,7 @@ pub struct Opt { #[structopt(short, long, default_value = "13")] after: u32, /// Number of the entry to view or edit + // TODO Select multiple entries at once entry: Option, #[structopt(subcommand)] command: Option, @@ -49,7 +53,7 @@ fn default_file() -> PathBuf { .join("main.today") } -pub fn run() -> anyhow::Result<()> { +pub fn run() -> Result<()> { let opt = Opt::from_args(); let file = opt.file.unwrap_or_else(default_file); @@ -69,8 +73,7 @@ pub fn run() -> anyhow::Result<()> { match opt.command { None | Some(Command::Show) => match opt.entry { None => print!("{}", show::show_all(&layout)), - // Some(i) => print!("{}", render::render_entry(&files, &entries, &layout, i)), - Some(i) => todo!(), + Some(n) => show::show_entry(&files, &entries, &layout, n)?, }, Some(Command::Done) => match opt.entry { None => { diff --git a/src/cli/error.rs b/src/cli/error.rs new file mode 100644 index 0000000..944bb55 --- /dev/null +++ b/src/cli/error.rs @@ -0,0 +1,15 @@ +use std::result; + +use crate::{eval, files}; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("{0}")] + Files(#[from] files::Error), + #[error("{0}")] + Eval(#[from] eval::Error), + #[error("No entry with number {0}")] + NoSuchEntry(usize), +} + +pub type Result = result::Result; diff --git a/src/cli/layout/line.rs b/src/cli/layout/line.rs index 714fb64..6587f67 100644 --- a/src/cli/layout/line.rs +++ b/src/cli/layout/line.rs @@ -11,6 +11,7 @@ use crate::eval::{Entry, EntryKind}; use crate::files::primitives::Time; use crate::files::Files; +use super::super::error::{Error, Result}; use super::day::{DayEntry, DayLayout}; #[derive(Debug, Clone, Copy)] @@ -101,12 +102,13 @@ impl LineLayout { &self.numbers } - pub fn look_up_number(&self, number: usize) -> Option { + pub fn look_up_number(&self, number: usize) -> Result { self.numbers .iter() .filter(|(_, n)| **n == number) .map(|(i, _)| *i) .next() + .ok_or_else(|| Error::NoSuchEntry(number)) } fn render_layout_entry(&mut self, files: &Files, entries: &[Entry], l_entry: &DayEntry) { diff --git a/src/cli/show.rs b/src/cli/show.rs index 6830ff3..44da6c6 100644 --- a/src/cli/show.rs +++ b/src/cli/show.rs @@ -2,8 +2,11 @@ use std::cmp; use chrono::{Datelike, NaiveDate}; +use crate::eval::{Entry, EntryKind}; use crate::files::primitives::{Time, Weekday}; +use crate::files::Files; +use super::error::{Error, Result}; use super::layout::line::{LineEntry, LineLayout, SpanSegment}; struct ShowLines { @@ -119,3 +122,55 @@ pub fn show_all(layout: &LineLayout) -> String { } show_lines.result() } + +pub fn show_entry( + files: &Files, + entries: &[Entry], + layout: &LineLayout, + number: usize, +) -> Result<()> { + let index = layout.look_up_number(number)?; + let entry = &entries[index]; + let command = files.command(entry.source); + + match entry.kind { + EntryKind::Task => println!("TASK {}", command.title()), + EntryKind::TaskDone(when) => { + println!("DONE {}", command.title()); + println!("DONE AT {}", when); + } + EntryKind::Note => println!("NOTE {}", command.title()), + EntryKind::Birthday(Some(age)) => { + println!("BIRTHDAY {}", command.title()); + println!("AGE {}", age); + } + EntryKind::Birthday(None) => { + println!("BIRTHDAY {}", command.title()); + println!("AGE UNKNOWN"); + } + } + + if let Some(dates) = entry.dates { + let (start, end) = dates.start_end(); + if start == end { + match dates.start_end_time() { + Some((s, e)) if s == e => println!("DATE {} {}", start, s), + Some((s, e)) => println!("DATE {} {} -- {}", start, s, e), + None => println!("DATE {}", start), + } + } else { + match dates.start_end_time() { + Some((s, e)) => println!("DATE {} {} -- {} {}", start, s, end, e), + None => println!("DATE {} -- {}", start, end), + } + } + } else { + println!("NO DATE"); + }; + + for line in command.desc() { + println!("# {}", line); + } + + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index d22645b..028a70f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,5 +8,6 @@ mod eval; mod files; fn main() -> anyhow::Result<()> { - cli::run() + cli::run()?; + Ok(()) }