Improve error handling
This commit is contained in:
parent
96f7aa77dc
commit
d67bf0aeea
6 changed files with 197 additions and 34 deletions
90
src/cli.rs
90
src/cli.rs
|
|
@ -1,14 +1,15 @@
|
|||
use std::path::PathBuf;
|
||||
use std::{process, result};
|
||||
|
||||
use chrono::{Duration, NaiveDate};
|
||||
use chrono::{Duration, NaiveDate, NaiveDateTime};
|
||||
use directories::ProjectDirs;
|
||||
use structopt::StructOpt;
|
||||
|
||||
use crate::eval::{DateRange, EntryMode};
|
||||
use crate::eval::{DateRange, Entry, EntryMode};
|
||||
use crate::files::{self, Files};
|
||||
|
||||
use self::error::Result;
|
||||
use self::layout::line::LineLayout;
|
||||
|
||||
mod done;
|
||||
mod error;
|
||||
|
|
@ -67,7 +68,63 @@ fn load_files(opt: &Opt) -> result::Result<Files, files::Error> {
|
|||
Files::load(&file)
|
||||
}
|
||||
|
||||
pub fn run() -> Result<()> {
|
||||
fn find_now(opt: &Opt, files: &Files) -> NaiveDateTime {
|
||||
let now = files.now().naive_local();
|
||||
if let Some(date) = opt.date {
|
||||
date.and_time(now.time())
|
||||
} else {
|
||||
now
|
||||
}
|
||||
}
|
||||
|
||||
fn find_range(opt: &Opt, now: NaiveDateTime) -> DateRange {
|
||||
let range_date = opt.date.unwrap_or_else(|| now.date());
|
||||
DateRange::new(
|
||||
range_date - Duration::days(opt.before.into()),
|
||||
range_date + Duration::days(opt.after.into()),
|
||||
)
|
||||
.expect("determine range")
|
||||
}
|
||||
|
||||
fn find_entries(files: &Files, range: DateRange) -> Result<Vec<Entry>> {
|
||||
Ok(files.eval(EntryMode::Relevant, range)?)
|
||||
}
|
||||
|
||||
fn find_layout(
|
||||
files: &Files,
|
||||
entries: &[Entry],
|
||||
range: DateRange,
|
||||
now: NaiveDateTime,
|
||||
) -> LineLayout {
|
||||
layout::layout(files, entries, range, now)
|
||||
}
|
||||
|
||||
fn run_command(opt: &Opt, files: &mut Files, range: DateRange, now: NaiveDateTime) -> Result<()> {
|
||||
match &opt.command {
|
||||
None => {
|
||||
let entries = find_entries(files, range)?;
|
||||
let layout = find_layout(files, &entries, range, now);
|
||||
print::print(&layout);
|
||||
}
|
||||
Some(Command::Show { entries: ns }) => {
|
||||
let entries = find_entries(files, range)?;
|
||||
let layout = find_layout(files, &entries, range, now);
|
||||
show::show(files, &entries, &layout, ns)?;
|
||||
}
|
||||
Some(Command::Done { entries: ns }) => {
|
||||
let entries = find_entries(files, range)?;
|
||||
let layout = find_layout(files, &entries, range, now);
|
||||
done::done(files, &entries, &layout, ns, now)?;
|
||||
let entries = find_entries(files, range)?;
|
||||
let layout = find_layout(files, &entries, range, now);
|
||||
print::print(&layout);
|
||||
}
|
||||
Some(Command::Fmt) => files.mark_all_dirty(),
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn run() {
|
||||
let opt = Opt::from_args();
|
||||
|
||||
let mut files = match load_files(&opt) {
|
||||
|
|
@ -78,33 +135,16 @@ pub fn run() -> Result<()> {
|
|||
}
|
||||
};
|
||||
|
||||
let now = files.now().naive_local();
|
||||
let now = find_now(&opt, &files);
|
||||
let range = find_range(&opt, now);
|
||||
|
||||
let range_date = opt.date.unwrap_or_else(|| now.date());
|
||||
let range = DateRange::new(
|
||||
range_date - Duration::days(opt.before.into()),
|
||||
range_date + Duration::days(opt.after.into()),
|
||||
)
|
||||
.expect("determine range");
|
||||
|
||||
let entries = files.eval(EntryMode::Relevant, range)?;
|
||||
let layout = layout::layout(&files, &entries, range, now);
|
||||
|
||||
match opt.command {
|
||||
None => print::print(&layout),
|
||||
Some(Command::Show { entries: numbers }) => {
|
||||
show::show(&files, &entries, &layout, &numbers)?
|
||||
}
|
||||
Some(Command::Done { entries: numbers }) => {
|
||||
done::done(&mut files, &entries, &layout, &numbers, now)?
|
||||
}
|
||||
Some(Command::Fmt) => files.mark_all_dirty(),
|
||||
if let Err(e) = run_command(&opt, &mut files, range, now) {
|
||||
e.print(&files);
|
||||
process::exit(1);
|
||||
}
|
||||
|
||||
if let Err(e) = files.save() {
|
||||
e.print();
|
||||
process::exit(1);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue