clockify 0.1.1

Basic TUI for Clockify time tracking application
Documentation
use std::fmt;
use serde::{Serialize, Deserialize}; 
use crate::{
    clockify::Config, 
    api::{
        EndPoint, 
        common::Rate
    }, ui::components::Id, error::Error
};

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Task {
    pub id: String, 
    pub name: String,
    pub project_id: Option<String>, 
    pub assignee_ids: Option<Vec<String>>, 
    pub assignee_id: Option<String>, 
    pub user_group_ids: Option<Vec<String>>, 
    pub estimate: Option<String>, 
    pub status: String, 
    pub duration: Option<String>, 
    pub billable: bool, 
    pub hourly_rate: Option<Rate>, 
    pub cost_rate: Option<Rate>
}

impl From<&str> for Task {
    fn from(s: &str) -> Task {
        Task { name: s.to_string(), ..Default::default() }
    }
}

impl fmt::Display for Task {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.name)
    }
}

impl Id for Task {
    fn id(&self) -> String {
        self.id.clone()
    }
}

impl EndPoint for Task {
    fn endpoint(config: &Config) -> Result<String, Error> {
        Ok(format!("/workspaces/{}/projects/{}/tasks", 
            config.workspace_id.as_ref().ok_or(Error::MissingWorkspace)?.clone(),
            config.project_id.as_ref().ok_or(Error::MissingProject)?.clone()
        ))
    }
}