backlogr 0.5.0

CLI for interacting with the Taiga REST API
Documentation
use backlogr::{
    ExitOnError,
    cli::{Cli, Command},
    integrations::taiga::{Status, TaigaAPI, UserStories},
};
use clap::Parser;
use color_eyre::owo_colors::OwoColorize;
use eyre::Result;

fn main() -> Result<()> {
    color_eyre::install()?;

    let cli = Cli::parse();
    let username = cli.username.clone();
    let password = cli.password.clone();
    let project_name = cli.project_name.clone();

    let taiga_api = TaigaAPI::authenticate(&username, &password).or_exit();

    let project_id = taiga_api.get_project_id(&project_name).or_exit();

    match cli.command() {
        Command::Create {
            subject,
            description,
            status,
        } => {
            let description = description.unwrap_or_default();
            let story_id = taiga_api
                .create_story(project_id, &subject, &description, &status)
                .or_exit();

            eprintln!(
                "✅ Created story: \"{subject}\" (#{})",
                story_id.bold().bright_green()
            );
        }
        Command::Wip { story_id } => {
            let real_id = taiga_api.get_story_id(project_id, story_id).or_exit();

            taiga_api
                .update_story_status(project_id, story_id, real_id, &Status::Wip)
                .or_exit();
        }
        Command::Done { story_id } => {
            let real_id = taiga_api.get_story_id(project_id, story_id).or_exit();

            taiga_api
                .update_story_status(project_id, story_id, real_id, &Status::Done)
                .or_exit();
        }
        Command::Delete { story_id } => {
            let real_id = taiga_api.get_story_id(project_id, story_id).or_exit();

            taiga_api.delete_story(real_id).or_exit();

            eprintln!(
                "✅ Successfully deleted user story (#{})",
                story_id.bold().bright_green(),
            );
        }
        Command::List { format } => {
            let stories = taiga_api.list_all_stories(project_id).or_exit();

            match format {
                backlogr::cli::Format::Pretty => {
                    let user_stories = UserStories::new(stories);

                    eprintln!("{user_stories}");
                }
                backlogr::cli::Format::Json => {
                    println!("{}", serde_json::to_string_pretty(&stories)?);
                }
            }
        }
    }
    Ok(())
}