use crate::agile::REST_BASE;
use crate::{api::Rq, error::Error, Rujira};
use reqwest::Method;
use serde_json::Value;
pub fn get(bot: Rujira, key: &str) -> Rq {
Rq::new(bot)
.uri(&format!("{}/board/{key}", REST_BASE))
.method(Method::GET)
}
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)])
})
}
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)
}