use super::board::Board;
use super::card::Card;
use super::client::TrelloClient;
use super::trello_error::TrelloError;
use super::trello_object::TrelloObject;
use serde::Deserialize;
type Result<T> = std::result::Result<T, TrelloError>;
pub struct SearchOptions {
pub partial: bool,
pub cards_limit: Option<i32>,
pub boards_limit: Option<i32>,
}
impl Default for SearchOptions {
fn default() -> Self {
SearchOptions {
partial: false,
cards_limit: None,
boards_limit: None,
}
}
}
#[derive(Deserialize, Debug, Eq, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct SearchResult {
#[serde(default = "Vec::new")]
pub cards: Vec<Card>,
#[serde(default = "Vec::new")]
pub boards: Vec<Board>,
}
pub fn search(
client: &TrelloClient,
search_term: &str,
options: &SearchOptions,
) -> Result<SearchResult> {
let partial = options.partial.to_string();
let card_fields = Card::get_fields().join(",");
let board_fields = Board::get_fields().join(",");
let mut params = vec![
("query", search_term),
("partial", &partial),
("card_fields", &card_fields),
("board_fields", &board_fields),
];
let cards_limit;
let boards_limit;
if let Some(value) = options.cards_limit {
cards_limit = value.to_string();
params.push(("cards_limit", &cards_limit));
}
if let Some(value) = options.boards_limit {
boards_limit = value.to_string();
params.push(("boards_limit", &boards_limit));
}
let url = client.config.get_trello_url("/1/search/", ¶ms)?;
Ok(client.client.get(url).send()?.error_for_status()?.json()?)
}