extract-cli #9
11 changed files with 70 additions and 41 deletions
|
@ -14,6 +14,9 @@
|
|||
//! along with tas. If not, see <https://www.gnu.org/licenses/>.
|
||||
//!
|
||||
|
||||
pub mod finish;
|
||||
pub mod status;
|
||||
|
||||
#[derive(clap::Parser)]
|
||||
#[clap(author, version, about = "Experemental task manager")]
|
||||
pub struct Args {
|
||||
|
|
0
src/cli/add.rs
Normal file
0
src/cli/add.rs
Normal file
0
src/cli/edit.rs
Normal file
0
src/cli/edit.rs
Normal file
41
src/cli/finish.rs
Normal file
41
src/cli/finish.rs
Normal file
|
@ -0,0 +1,41 @@
|
|||
use crate::{CurrentTaskInfo, Task};
|
||||
use std::io::Write;
|
||||
use std::path::PathBuf;
|
||||
|
||||
pub struct Request {
|
||||
pub current_task_info: Option<CurrentTaskInfo>,
|
||||
pub tasks: Vec<Task>,
|
||||
pub finished_tasks_file_path: PathBuf,
|
||||
pub tasks_file_path: PathBuf,
|
||||
pub current_task_info_file_path: PathBuf,
|
||||
}
|
||||
|
||||
pub fn execute(mut req: Request) {
|
||||
match req.current_task_info.take() {
|
||||
None => {
|
||||
panic!("You can use the finish subcommand only when you have an active task")
|
||||
}
|
||||
Some(info) => {
|
||||
let mut finished_tasks: Vec<Task> = std::fs::File::open(&req.finished_tasks_file_path)
|
||||
.map(|file| serde_json::from_reader(file).unwrap())
|
||||
.unwrap_or_default();
|
||||
|
||||
let task = req.tasks.remove(info.task_idx - 1);
|
||||
finished_tasks.push(task);
|
||||
|
||||
let mut file = std::fs::File::create(req.tasks_file_path).unwrap();
|
||||
file.write_all(&serde_json::to_vec(&req.tasks).unwrap())
|
||||
.unwrap();
|
||||
|
||||
let mut file = std::fs::File::create(req.finished_tasks_file_path).unwrap();
|
||||
file.write_all(&serde_json::to_vec(&finished_tasks).unwrap())
|
||||
.unwrap();
|
||||
|
||||
let mut file = std::fs::File::create(req.current_task_info_file_path).unwrap();
|
||||
file.write_all(&serde_json::to_vec(&req.current_task_info).unwrap())
|
||||
.unwrap();
|
||||
|
||||
println!("finished");
|
||||
}
|
||||
}
|
||||
}
|
0
src/cli/list.rs
Normal file
0
src/cli/list.rs
Normal file
0
src/cli/pause.rs
Normal file
0
src/cli/pause.rs
Normal file
0
src/cli/priority.rs
Normal file
0
src/cli/priority.rs
Normal file
0
src/cli/remove.rs
Normal file
0
src/cli/remove.rs
Normal file
0
src/cli/start.rs
Normal file
0
src/cli/start.rs
Normal file
16
src/cli/status.rs
Normal file
16
src/cli/status.rs
Normal file
|
@ -0,0 +1,16 @@
|
|||
use crate::CurrentTaskInfo;
|
||||
|
||||
pub fn execute(current_task_info: Option<CurrentTaskInfo>) {
|
||||
match current_task_info {
|
||||
None => {
|
||||
panic!("You don't have an active task.");
|
||||
}
|
||||
Some(info) => {
|
||||
println!("Information about your current task:");
|
||||
println!(" {}", info.task.name);
|
||||
if let Some(link) = info.task.link {
|
||||
println!(" link: {}", link);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
51
src/main.rs
51
src/main.rs
|
@ -232,57 +232,26 @@ fn main() {
|
|||
.unwrap();
|
||||
println!("paused");
|
||||
}
|
||||
cli::SubCommand::Finish => match current_task_info.take() {
|
||||
None => {
|
||||
panic!("You can use the finish subcommand only when you have an active task")
|
||||
}
|
||||
Some(info) => {
|
||||
let mut finished_tasks: Vec<Task> = std::fs::File::open(&finished_tasks_file_path)
|
||||
.map(|file| serde_json::from_reader(file).unwrap())
|
||||
.unwrap_or_default();
|
||||
|
||||
let task = tasks.remove(info.task_idx - 1);
|
||||
finished_tasks.push(task);
|
||||
|
||||
let mut file = std::fs::File::create(&tasks_file_path).unwrap();
|
||||
file.write_all(&serde_json::to_vec(&tasks).unwrap())
|
||||
.unwrap();
|
||||
|
||||
let mut file = std::fs::File::create(&finished_tasks_file_path).unwrap();
|
||||
file.write_all(&serde_json::to_vec(&finished_tasks).unwrap())
|
||||
.unwrap();
|
||||
|
||||
let mut file = std::fs::File::create(¤t_task_info_file_path).unwrap();
|
||||
file.write_all(&serde_json::to_vec(¤t_task_info).unwrap())
|
||||
.unwrap();
|
||||
|
||||
println!("finished");
|
||||
}
|
||||
},
|
||||
cli::SubCommand::Status => match current_task_info {
|
||||
None => {
|
||||
panic!("You don't have an active task.");
|
||||
}
|
||||
Some(info) => {
|
||||
println!("Information about your current task:");
|
||||
println!(" {}", info.task.name);
|
||||
if let Some(link) = info.task.link {
|
||||
println!(" link: {}", link);
|
||||
}
|
||||
}
|
||||
},
|
||||
cli::SubCommand::Finish => cli::finish::execute(cli::finish::Request {
|
||||
tasks,
|
||||
current_task_info,
|
||||
current_task_info_file_path,
|
||||
tasks_file_path,
|
||||
finished_tasks_file_path,
|
||||
}),
|
||||
cli::SubCommand::Status => cli::status::execute(current_task_info),
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, Clone)]
|
||||
struct Task {
|
||||
pub struct Task {
|
||||
name: String,
|
||||
link: Option<String>,
|
||||
// created_at
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize)]
|
||||
struct CurrentTaskInfo {
|
||||
pub struct CurrentTaskInfo {
|
||||
task_idx: usize,
|
||||
task: Task,
|
||||
// started_at
|
||||
|
|
Loading…
Reference in a new issue