Skip to main content

trello/
search.rs

1use super::board::Board;
2use super::card::Card;
3use super::client::TrelloClient;
4use super::trello_error::TrelloError;
5use super::trello_object::TrelloObject;
6
7use serde::Deserialize;
8
9type Result<T> = std::result::Result<T, TrelloError>;
10
11#[derive(Default)]
12pub struct SearchOptions {
13    pub partial: bool,
14    pub cards_limit: Option<i32>,
15    pub boards_limit: Option<i32>,
16}
17
18#[derive(Deserialize, Debug, Eq, PartialEq, Clone)]
19#[serde(rename_all = "camelCase")]
20pub struct SearchResult {
21    #[serde(default = "Vec::new")]
22    pub cards: Vec<Card>,
23    #[serde(default = "Vec::new")]
24    pub boards: Vec<Board>,
25}
26
27/// Implements the Trello Search API
28/// https://developer.atlassian.com/cloud/trello/rest/api-group-search/#api-search-get
29pub fn search(
30    client: &TrelloClient,
31    search_term: &str,
32    options: &SearchOptions,
33) -> Result<SearchResult> {
34    let partial = options.partial.to_string();
35    let card_fields = Card::get_fields().join(",");
36    let board_fields = Board::get_fields().join(",");
37
38    let mut params = vec![
39        ("query", search_term),
40        ("partial", &partial),
41        ("card_fields", &card_fields),
42        ("board_fields", &board_fields),
43    ];
44
45    // declared in the outer scope so that references live long enough
46    let cards_limit;
47    let boards_limit;
48
49    if let Some(value) = options.cards_limit {
50        cards_limit = value.to_string();
51        params.push(("cards_limit", &cards_limit));
52    }
53    if let Some(value) = options.boards_limit {
54        boards_limit = value.to_string();
55        params.push(("boards_limit", &boards_limit));
56    }
57
58    let url = client.config.get_trello_url("/1/search/", &params)?;
59
60    Ok(client.client.get(url).send()?.error_for_status()?.json()?)
61}