rujira 0.4.1

This module provides an API for working with Jira
Documentation
//! This module contains the requests for the board API
//!
//! [docs](https://docs.atlassian.com/jira-software/REST/9.17.0/#agile/1.0/board)
use crate::agile::REST_BASE;
use crate::{api::Rq, error::Error, Rujira};
use reqwest::Method;
use serde_json::Value;

/// Get the Request for getting a board
///
/// [docs](https://docs.atlassian.com/jira-software/REST/9.17.0/#agile/1.0/board-getBoard)
pub fn get(bot: Rujira, key: &str) -> Rq {
    Rq::new(bot)
        .uri(&format!("{}/board/{key}", REST_BASE))
        .method(Method::GET)
}

/// Get the Request for getting a list of boards
///
/// [docs](https://docs.atlassian.com/jira-software/REST/9.17.0/#agile/1.0/board-getBoard)
pub fn list(
    bot: Rujira,
    start_at: Option<u32>,
    max_results: Option<u32>,
    type_: Option<&str>,
    name: Option<&str>,
    project_key_or_id: Option<&str>,
) -> Rq {
    Rq::new(bot)
        .uri(&format!("{}/board", REST_BASE))
        .method(Method::GET)
        .apply_if(start_at, |r, v| {
            r.add_params(vec![("startAt", v.to_string().as_str())])
        })
        .apply_if(max_results, |r, v| {
            r.add_params(vec![("maxResults", v.to_string().as_str())])
        })
        .apply_if(type_, |r, v| r.add_params(vec![("type", v)]))
        .apply_if(name, |r, v| r.add_params(vec![("name", v)]))
        .apply_if(project_key_or_id, |r, v| {
            r.add_params(vec![("projectKeyOrId", v)])
        })
}

/// Get board ID by name
pub async fn id_by_name(bot: Rujira, name: &str) -> Result<i64, Error> {
    let list = list(bot, None, None, None, Some(name), None)
        .apply()
        .await?;
    let boards = list.data["values"].as_array().ok_or(Error::NoData)?;
    let matching_board = boards
        .iter()
        .find(|item| item.get("name").and_then(Value::as_str) == Some(name))
        .ok_or(Error::BoardNotFound(name.to_string()))?;
    let id = matching_board["id"].as_i64().ok_or(Error::InvalidBoardId)?;
    Ok(id)
}