/* This file is part of DarkFi (https://dark.fi)
*
* Copyright (C) 2020-2023 Dyne.org foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
use darkfi::{util::time::Timestamp, Result};
use crate::due_as_timestamp;
pub(crate) use taud::task_info::{State, TaskEvent, TaskInfo};
#[derive(Clone, Debug)]
pub struct BaseTask {
pub title: String,
pub tags: Vec,
pub desc: Option,
pub assign: Vec,
pub project: Vec,
pub due: Option,
pub rank: Option,
}
impl From for TaskInfo {
fn from(value: BaseTask) -> Self {
Self {
ref_id: String::default(),
workspace: String::default(),
id: u32::default(),
title: value.title,
tags: value.tags,
desc: String::default(),
owner: String::default(),
assign: value.assign,
project: value.project,
due: value.due.map(Timestamp),
rank: value.rank,
created_at: Timestamp(u64::default()),
state: String::default(),
events: vec![],
comments: vec![],
}
}
}
pub fn task_from_cli(values: Vec) -> Result {
let mut title = String::new();
let mut tags = vec![];
let mut desc = None;
let mut project = vec![];
let mut assign = vec![];
let mut due = None;
let mut rank = None;
for val in values {
let field: Vec<&str> = val.split(':').collect();
if field.len() == 1 {
if field[0].starts_with('+') || field[0].starts_with('-') {
tags.push(field[0].into());
continue
}
if field[0].starts_with('@') {
assign.push(field[0].into());
continue
}
title.push_str(field[0]);
title.push(' ');
continue
}
if field.len() != 2 {
continue
}
if field[0] == "project" {
project = field[1].split(',').map(|s| s.into()).collect();
}
if field[0] == "desc" {
desc = Some(field[1].into());
}
if field[0] == "due" {
due = due_as_timestamp(field[1])
}
if field[0] == "rank" {
rank = Some(field[1].parse::()?);
}
}
let title = title.trim().into();
Ok(BaseTask { title, tags, desc, project, assign, due, rank })
}