Add default report command line argument

This commit is contained in:
Dheepak Krishnamurthy 2021-04-28 12:25:16 -06:00
parent 73a3dca579
commit 00989a0eb5
4 changed files with 36 additions and 19 deletions

View file

@ -199,10 +199,11 @@ pub struct TaskwarriorTuiApp {
pub command_history_context: HistoryContext, pub command_history_context: HistoryContext,
pub completion_list: CompletionList, pub completion_list: CompletionList,
pub show_completion_pane: bool, pub show_completion_pane: bool,
pub report: String,
} }
impl TaskwarriorTuiApp { impl TaskwarriorTuiApp {
pub fn new() -> Result<Self> { pub fn new(report: &str) -> Result<Self> {
let output = std::process::Command::new("task") let output = std::process::Command::new("task")
.arg("rc.color=off") .arg("rc.color=off")
.arg("show") .arg("show")
@ -224,7 +225,7 @@ impl TaskwarriorTuiApp {
} }
let data = String::from_utf8_lossy(&output.stdout); let data = String::from_utf8_lossy(&output.stdout);
let c = Config::new(&data)?; let c = Config::new(&data, report)?;
let kc = KeyConfig::new(&data)?; let kc = KeyConfig::new(&data)?;
let (w, h) = crossterm::terminal::size()?; let (w, h) = crossterm::terminal::size()?;
@ -251,7 +252,7 @@ impl TaskwarriorTuiApp {
task_details_scroll: 0, task_details_scroll: 0,
task_report_show_info: c.uda_task_report_show_info, task_report_show_info: c.uda_task_report_show_info,
config: c, config: c,
task_report_table: TaskReportTable::new(&data)?, task_report_table: TaskReportTable::new(&data, report)?,
calendar_year: Local::today().year(), calendar_year: Local::today().year(),
help_popup: Help::new(), help_popup: Help::new(),
contexts: vec![], contexts: vec![],
@ -263,6 +264,7 @@ impl TaskwarriorTuiApp {
command_history_context: HistoryContext::new("command.history"), command_history_context: HistoryContext::new("command.history"),
completion_list: CompletionList::with_items(vec![]), completion_list: CompletionList::with_items(vec![]),
show_completion_pane: false, show_completion_pane: false,
report: report.to_string(),
}; };
for c in app.config.filter.chars() { for c in app.config.filter.chars() {
@ -998,7 +1000,7 @@ impl TaskwarriorTuiApp {
pub fn update(&mut self, force: bool) -> Result<()> { pub fn update(&mut self, force: bool) -> Result<()> {
if force || self.dirty || self.tasks_changed_since(self.last_export)? { if force || self.dirty || self.tasks_changed_since(self.last_export)? {
self.last_export = Some(std::time::SystemTime::now()); self.last_export = Some(std::time::SystemTime::now());
self.task_report_table.export_headers(None)?; self.task_report_table.export_headers(None, &self.report)?;
let _ = self.export_tasks(); let _ = self.export_tasks();
self.export_contexts()?; self.export_contexts()?;
self.update_tags(); self.update_tags();

View file

@ -64,7 +64,7 @@ pub struct Config {
} }
impl Config { impl Config {
pub fn new(data: &str) -> Result<Self> { pub fn new(data: &str, report: &str) -> Result<Self> {
let bool_collection = Self::get_bool_collection(); let bool_collection = Self::get_bool_collection();
let enabled = true; let enabled = true;
@ -72,7 +72,7 @@ impl Config {
let print_empty_columns = bool_collection.get("print_empty_columns").cloned().unwrap_or(false); let print_empty_columns = bool_collection.get("print_empty_columns").cloned().unwrap_or(false);
let color = Self::get_color_collection(data); let color = Self::get_color_collection(data);
let filter = Self::get_filter(data); let filter = Self::get_filter(data, report);
let data_location = Self::get_data_location(data); let data_location = Self::get_data_location(data);
let due = Self::get_due(data); let due = Self::get_due(data);
let rule_precedence_color = Self::get_rule_precedence_color(data); let rule_precedence_color = Self::get_rule_precedence_color(data);
@ -339,9 +339,9 @@ impl Config {
data.split(',').map(|s| s.to_string()).collect::<Vec<_>>() data.split(',').map(|s| s.to_string()).collect::<Vec<_>>()
} }
fn get_filter(data: &str) -> String { fn get_filter(data: &str, report: &str) -> String {
let filter = Self::get_config("report.next.filter", data) let filter = Self::get_config(format!("report.{}.filter", report).as_str(), data)
.context("Unable to parse `task show report.next.filter`.") .context(format!("Unable to parse `task show report.{}.filter`.", report))
.unwrap(); .unwrap();
format!("{} ", filter) format!("{} ", filter)
} }

View file

@ -70,21 +70,30 @@ fn main() {
.help("Sets a custom config file") .help("Sets a custom config file")
.takes_value(true), .takes_value(true),
) )
.arg(
Arg::with_name("report")
.short("r")
.long("report")
.value_name("STRING")
.help("Sets default report")
.takes_value(true),
)
.get_matches(); .get_matches();
let config = matches.value_of("config").unwrap_or("~/.taskrc"); let config = matches.value_of("config").unwrap_or("~/.taskrc");
task::block_on(tui_main(config)).expect( let report = matches.value_of("report").unwrap_or("next");
task::block_on(tui_main(config, report)).expect(
"[taskwarrior-tui error]. Please report as a github issue on https://github.com/kdheepak/taskwarrior-tui", "[taskwarrior-tui error]. Please report as a github issue on https://github.com/kdheepak/taskwarrior-tui",
); );
} }
async fn tui_main(_config: &str) -> Result<()> { async fn tui_main(_config: &str, report: &str) -> Result<()> {
panic::set_hook(Box::new(|panic_info| { panic::set_hook(Box::new(|panic_info| {
destruct_terminal(); destruct_terminal();
better_panic::Settings::auto().create_panic_handler()(panic_info); better_panic::Settings::auto().create_panic_handler()(panic_info);
})); }));
let maybeapp = TaskwarriorTuiApp::new(); let maybeapp = TaskwarriorTuiApp::new(report);
if maybeapp.is_err() { if maybeapp.is_err() {
destruct_terminal(); destruct_terminal();
return Err(maybeapp.err().unwrap()); return Err(maybeapp.err().unwrap());

View file

@ -43,7 +43,7 @@ pub struct TaskReportTable {
} }
impl TaskReportTable { impl TaskReportTable {
pub fn new(data: &str) -> Result<Self> { pub fn new(data: &str, report: &str) -> Result<Self> {
let virtual_tags = vec![ let virtual_tags = vec![
"PROJECT", "PROJECT",
"BLOCKED", "BLOCKED",
@ -86,24 +86,27 @@ impl TaskReportTable {
virtual_tags: virtual_tags.iter().map(|s| s.to_string()).collect::<Vec<_>>(), virtual_tags: virtual_tags.iter().map(|s| s.to_string()).collect::<Vec<_>>(),
description_width: 100, description_width: 100,
}; };
task_report_table.export_headers(Some(data))?; task_report_table.export_headers(Some(data), report)?;
Ok(task_report_table) Ok(task_report_table)
} }
pub fn export_headers(&mut self, data: Option<&str>) -> Result<()> { pub fn export_headers(&mut self, data: Option<&str>, report: &str) -> Result<()> {
self.columns = vec![]; self.columns = vec![];
self.labels = vec![]; self.labels = vec![];
let data = match data { let data = match data {
Some(s) => s.to_string(), Some(s) => s.to_string(),
None => { None => {
let output = Command::new("task").arg("show").arg("report.next.columns").output()?; let output = Command::new("task")
.arg("show")
.arg(format!("report.{}.columns", report))
.output()?;
String::from_utf8_lossy(&output.stdout).into_owned() String::from_utf8_lossy(&output.stdout).into_owned()
} }
}; };
for line in data.split('\n') { for line in data.split('\n') {
if line.starts_with("report.next.columns") { if line.starts_with(format!("report.{}.columns", report).as_str()) {
let column_names = line.split(' ').collect::<Vec<_>>()[1]; let column_names = line.split(' ').collect::<Vec<_>>()[1];
for column in column_names.split(',') { for column in column_names.split(',') {
self.columns.push(column.to_string()); self.columns.push(column.to_string());
@ -111,11 +114,14 @@ impl TaskReportTable {
} }
} }
let output = Command::new("task").arg("show").arg("report.next.labels").output()?; let output = Command::new("task")
.arg("show")
.arg(format!("report.{}.labels", report))
.output()?;
let data = String::from_utf8_lossy(&output.stdout); let data = String::from_utf8_lossy(&output.stdout);
for line in data.split('\n') { for line in data.split('\n') {
if line.starts_with("report.next.labels") { if line.starts_with(format!("report.{}.labels", report).as_str()) {
let label_names = line.split(' ').collect::<Vec<_>>()[1]; let label_names = line.split(' ').collect::<Vec<_>>()[1];
for label in label_names.split(',') { for label in label_names.split(',') {
self.labels.push(label.to_string()); self.labels.push(label.to_string());