//! Copyright (C) 2022, Dmitriy Pleshevskiy //! //! tas is free software: you can redistribute it and/or modify //! it under the terms of the GNU General Public License as published by //! the Free Software Foundation, either version 3 of the License, or //! (at your option) any later version. //! //! tas is distributed in the hope that it will be useful, //! but WITHOUT ANY WARRANTY; without even the implied warranty of //! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //! GNU General Public License for more details. //! //! You should have received a copy of the GNU General Public License //! along with tas. If not, see . //! use crate::cli::print_task_detail; use crate::domain::CurrentTaskInfo; use crate::repo::Repository; #[derive(clap::Args)] pub struct Args { part: Option, } #[derive(clap::ValueEnum, Clone)] enum PrintPart { Project, DirPath, Link, } impl std::str::FromStr for PrintPart { type Err = &'static str; fn from_str(s: &str) -> Result { match s { "project" => Ok(PrintPart::Project), "dir" => Ok(PrintPart::DirPath), "link" => Ok(PrintPart::Link), _ => Err("Available parts: dir, link, project"), } } } pub fn execute(repo: impl Repository, args: Args) { let task = match repo.get_current_task_opt() { Ok(None) => { return eprintln!("You don't have an active task."); } Ok(Some(CurrentTaskInfo { task, .. })) => task, Err(err) => { return eprintln!("Cannot read current task: {}", err); } }; match args.part { None => { println!("Information about your current task:"); print_task_detail(&task); } Some(PrintPart::Project) => { println!("{}", task.project.unwrap_or_else(|| String::from('-'))) } Some(PrintPart::DirPath) => { println!( "{}", task.dir_path .unwrap_or_else(|| std::env::current_dir().expect("Cannot get current dir")) .to_string_lossy() ) } Some(PrintPart::Link) => { if let Some(link) = task.link { println!("{}", link) } else { eprintln!("The current task doesn't contain link") } } } }