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
27pub 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 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/", ¶ms)?;
59
60 Ok(client.client.get(url).send()?.error_for_status()?.json()?)
61}