76 lines
2.2 KiB
Rust
76 lines
2.2 KiB
Rust
//! Copyright (C) 2022, Dmitriy Pleshevskiy <dmitriy@ideascup.me>
|
|
//!
|
|
//! 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 <https://www.gnu.org/licenses/>.
|
|
//!
|
|
use crate::cli::print_task_detail;
|
|
use crate::domain::CurrentTaskInfo;
|
|
use crate::repo::Repository;
|
|
|
|
#[derive(clap::Args)]
|
|
pub struct Args {
|
|
part: Option<PrintPart>,
|
|
}
|
|
|
|
#[derive(clap::ValueEnum, Clone)]
|
|
enum PrintPart {
|
|
Path,
|
|
Link,
|
|
}
|
|
|
|
impl std::str::FromStr for PrintPart {
|
|
type Err = &'static str;
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
match s {
|
|
"path" => Ok(PrintPart::Path),
|
|
"link" => Ok(PrintPart::Link),
|
|
_ => Err(r#"You can display only "path" or "link""#),
|
|
}
|
|
}
|
|
}
|
|
|
|
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::Path) => {
|
|
println!(
|
|
"{}",
|
|
task.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")
|
|
}
|
|
}
|
|
}
|
|
}
|