rujira 0.4.1

This module provides an API for working with Jira
Documentation
//! This module contains functions for working with projects.
//!
//! [docs](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project)
use serde_json::json;

use crate::{Rub, Rujira};

use super::{Method, Rq, REST_BASE};

/// Create a new project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-createProject)
pub fn create(bot: Rujira, key: &str, name: &str, project_type_key: &str, lead: &str) -> Rq {
    Rq::new(bot)
        .uri(&format!("{}/project", REST_BASE))
        .method(Method::POST)
        .add_payload("key", json!(key))
        .add_payload("name", json!(name))
        .add_payload("projectTypeKey", json!(project_type_key))
        .add_payload("lead", json!(lead))
}

/// Update a project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-updateProject)
pub fn update(
    bot: Rujira,
    project_id_or_key: &str,
    update: serde_json::Value,
    expand: Option<&str>,
) -> Rq {
    Rq::new(bot)
        .uri(&format!("{}/project/{}", REST_BASE, project_id_or_key))
        .method(Method::PUT)
        .apply_if(expand, |r, v| r.add_params(vec![("expand", v)]))
        .load_payload(update)
}

/// Delete an existing project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-deleteProject)
pub fn delete(bot: Rujira, project_id_or_key: &str) -> Rq {
    Rq::new(bot)
        .uri(&format!("{}/project/{}", REST_BASE, project_id_or_key))
        .method(Method::DELETE)
}

/// List all available projects
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-getAllProjects)
pub fn list(
    bot: Rujira,
    include_archived: Option<bool>,
    browse_archive: Option<bool>,
    expand: Option<&str>,
    recent: Option<u8>,
) -> Rq {
    Rq::new(bot)
        .uri(&format!("{}/project", REST_BASE))
        .method(Method::GET)
        .add_params(vec![(
            "includeArchived",
            include_archived.unwrap_or(false).to_static(),
        )])
        .add_params(vec![(
            "browseArchive",
            browse_archive.unwrap_or(false).to_static(),
        )])
        .apply_if(expand, |r, v| r.add_params(vec![("expand", v)]))
        .apply_if(recent, |r, v| {
            if v > 20 {
                tracing::debug!("Recent limit is 20");
            };
            r.add_params(vec![("recent", v.to_string().as_str())])
        })
}

/// Get a project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-getProject)
pub fn get(bot: Rujira, project_id_or_key: &str, expand: Option<&str>) -> Rq {
    Rq::new(bot)
        .uri(&format!("{}/project/{project_id_or_key}", REST_BASE))
        .method(Method::GET)
        .apply_if(expand, |r, v| r.add_params(vec![("expand", v)]))
}

/// Archives a project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-archiveProject)
pub fn archive(bot: Rujira, project_id_or_key: &str) -> Rq {
    Rq::new(bot)
        .uri(&format!(
            "{}/project/{project_id_or_key}/archive",
            REST_BASE
        ))
        .method(Method::PUT)
}

/// Get project components
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-getProjectComponents)
pub fn components(bot: Rujira, project_id_or_key: &str) -> Rq {
    Rq::new(bot)
        .uri(&format!(
            "{}/project/{project_id_or_key}/components",
            REST_BASE
        ))
        .method(Method::PUT)
}

/// Restore archived a project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-restoreProject)
pub fn restore(bot: Rujira, project_id_or_key: &str) -> Rq {
    Rq::new(bot)
        .uri(&format!(
            "{}/project/{project_id_or_key}/restore",
            REST_BASE
        ))
        .method(Method::PUT)
}

/// Update the type of a project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-updateProjectType)
pub fn r#type(bot: Rujira, project_id_or_key: &str, project_type_key: &str) -> Rq {
    Rq::new(bot)
        .uri(&format!(
            "{}/project/{project_id_or_key}/type/{project_type_key}",
            REST_BASE
        ))
        .method(Method::PUT)
}

/// Returns all versions for the specified project paginated
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/latest/#api/2/project-getProjectVersionsPaginated)
pub fn version(
    bot: Rujira,
    project_id_or_key: &str,
    order_by: Option<&str>,
    expand: Option<&str>,
    max_results: Option<u32>,
    start_at: Option<u32>,
) -> Rq {
    Rq::new(bot)
        .uri(&format!(
            "{}/project/{project_id_or_key}/version",
            REST_BASE
        ))
        .method(Method::GET)
        .apply_if(order_by, |r, v| r.add_params(vec![("orderBy", v)]))
        .apply_if(expand, |r, v| r.add_params(vec![("expand", v)]))
        .apply_if(max_results, |r, v| {
            r.add_params(vec![("maxResults", v.to_string().as_str())])
        })
        .apply_if(start_at, |r, v| {
            r.add_params(vec![("startAt", v.to_string().as_str())])
        })
}

/// Returns all versions for the specified project
///
/// [API](https://docs.atlassian.com/software/jira/docs/api/REST/9.17.0/#api/2/project-getProjectVersions)
pub fn versions(bot: Rujira, project_id_or_key: &str, expand: Option<&str>) -> Rq {
    Rq::new(bot)
        .uri(&format!(
            "{}/project/{project_id_or_key}/versions",
            REST_BASE
        ))
        .method(Method::GET)
        .apply_if(expand, |r, v| r.add_params(vec![("expand", v)]))
}