mtgapi_client/api/card/
card_api.rs1use crate::api::card::filter::CardFilter;
2use crate::api::card::filtertypes::CardResponseField;
3use crate::api::error::MtgApiErrorKind;
4use failure::Error;
5use failure::ResultExt;
6use reqwest::Client;
7
8use crate::api::response::ApiResponse;
9use crate::model::card::CardDetail;
10use std::rc::Weak;
11
12use crate::api::util;
13
14pub struct CardApi {
16 client: Weak<Client>,
17 url: String,
18}
19
20impl CardApi {
21 pub(crate) fn new(client: Weak<Client>, url: String) -> CardApi {
22 CardApi { client, url }
23 }
24
25 #[allow(dead_code)]
27 pub fn all(&self) -> Box<AllCardsRequest> {
28 AllCardsRequest::new(self.client.clone(), &self.url, 100)
29 }
30
31 #[allow(dead_code)]
33 pub fn all_filtered(&self, filter: CardFilter) -> Box<AllCardsRequest> {
34 AllCardsRequest::new_filtered(self.client.clone(), &self.url, 100, filter)
35 }
36
37 pub async fn find(&self, id: u32) -> Result<ApiResponse<CardDetail>, Error> {
39 let url = [&self.url, "/cards/", &id.to_string()].join("");
40 let mut response = util::send_response(&url, &self.client).await?;
41 let headers = std::mem::take(response.headers_mut());
42 let body = response.text().await.context(MtgApiErrorKind::BodyReadError)?;
43 let card = util::retrieve_card_from_body(&body)?;
44 Ok(ApiResponse::new(*card, headers))
45 }
46}
47
48#[allow(dead_code)]
50pub struct AllCardsRequest {
51 page: u32,
52 client: Weak<Client>,
53 url: String,
54 filter: CardFilter,
55 order_by: CardResponseField,
56 page_size: u32,
57}
58
59impl AllCardsRequest {
60 fn new(client: Weak<Client>, api_url: &str, page_size: u32) -> Box<AllCardsRequest> {
61 let url = [api_url, "cards"].join("/");
62 Box::new(AllCardsRequest {
63 page: 1,
64 client,
65 url,
66 filter: CardFilter(String::new()),
67 page_size,
68 order_by: CardResponseField::Name,
69 })
70 }
71
72 fn new_filtered(
73 client: Weak<Client>,
74 api_url: &str,
75 page_size: u32,
76 filter: CardFilter,
77 ) -> Box<AllCardsRequest> {
78 let url = [api_url, "cards"].join("/");
79 Box::new(AllCardsRequest {
80 page: 1,
81 client,
82 url,
83 filter,
84 page_size,
85 order_by: CardResponseField::Name,
86 })
87 }
88
89 #[allow(dead_code)]
115 pub async fn next_page(&mut self) -> Result<ApiResponse<Vec<CardDetail>>, Error> {
116 let url = self.create_filtered_url();
117 let mut response = util::send_response(&url, &self.client).await?;
118 self.page += 1;
119 let headers = std::mem::take(response.headers_mut());
120 let body = response.text().await.context(MtgApiErrorKind::CardBodyParseError)?;
121 let cards = util::retrieve_cards_from_body(&body)?;
122 Ok(ApiResponse::new(cards, headers))
123 }
124
125 #[allow(dead_code)]
127 pub fn order_by(&mut self, field: CardResponseField) {
128 self.order_by = field;
129 }
130
131 #[allow(dead_code)]
133 pub fn set_page(&mut self, page: u32) {
134 self.page = page;
135 }
136
137 #[allow(dead_code)]
139 pub fn set_page_size(&mut self, size: u32) {
140 self.page_size = size;
141 }
142
143 fn create_filtered_url(&self) -> String {
144 let page_filter = ["page", self.page.to_string().as_str()].join("=");
145 let paged_filter = if self.filter.0.is_empty() {
146 [self.filter.0.as_str(), &page_filter].join("")
147 } else {
148 [self.filter.0.as_str(), &page_filter].join("&")
149 };
150 let page_size_filter = ["pageSize", &self.page_size.to_string()].join("=");
151 let paged_filter_sized = [paged_filter, page_size_filter].join("&");
152
153 [self.url.as_str(), paged_filter_sized.as_str()].join("?")
154 }
155}