granger 0.1.0

An opinionated Kanban Board for the solo developer
Documentation
use crate::state::model::State;
use crate::ticket::data::get_by_number;
use serde::Serialize;
use std::fmt;

#[derive(Debug, Serialize)]
pub struct Ticket {
    #[serde(skip_serializing)]
    pub id: usize,

    #[serde(skip_serializing)]
    pub board_id: usize,

    #[serde(skip_serializing)]
    pub number: usize,

    pub title: String,

    pub description: String,

    #[serde(skip_serializing)]
    pub state: State,

    pub blocked_by: usize,
}

impl Ticket {
    pub fn new(board_id: usize, number: usize, title: String, description: String) -> Ticket {
        Ticket {
            id: 0,
            board_id,
            number,
            title,
            description,
            state: State::ToDo,
            blocked_by: 0,
        }
    }
}

impl fmt::Display for Ticket {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        writeln!(f, "Ticket Number: {}\n", self.number)?;

        writeln!(f, "Title:\n{}\n", self.title)?;

        writeln!(f, "Description:\n{}\n", self.description)?;

        writeln!(f, "Current State:\n{}", self.state.to_string())?;

        if self.blocked_by > 0 {
            let blocking_ticket_title = get_by_number(self.board_id, self.blocked_by)
                .expect("Failed to retrieve blocking ticket title.")
                .title;
            writeln!(
                f,
                "\nBlocked by Ticket {} - {}",
                self.blocked_by, blocking_ticket_title
            )?;
        }

        Ok(())
    }
}