1mod images;
2mod legality;
3
4use serde::{Deserialize, Serialize};
5
6use crate::{
7 client::{ApiResult, Client},
8 errors::ClientError,
9};
10
11use self::{images::SetImages, legality::Legality};
12
13#[derive(Debug, Clone, Deserialize, Serialize)]
16#[cfg_attr(test, derive(Default))]
17pub struct Set {
18 pub id: String,
20 pub name: String,
22 pub series: String,
24 #[serde(alias = "printedTotal")]
26 pub printed_total: usize,
27 pub total: usize,
29 pub legalities: Legality,
31 #[serde(alias = "ptcgoCode")]
33 pub ptcgo_code: Option<String>,
34 #[serde(alias = "releaseDate")]
36 pub release_date: String,
37 #[serde(alias = "updatedAt")]
39 pub updated_at: String,
40 pub images: SetImages,
42}
43
44pub struct GetSetRequest {
45 pub id: String,
46}
47
48impl GetSetRequest {
49 pub fn new(id: &str) -> Self {
50 GetSetRequest { id: id.into() }
51 }
52}
53
54pub struct SearchSetsRequest {
55 pub query: Option<String>,
57 pub page: Option<u16>,
59 pub page_size: Option<u8>,
61 pub order_by: Option<String>,
63}
64
65impl SearchSetsRequest {
66 pub fn new(query: &str) -> Self {
67 SearchSetsRequest {
68 query: Some(String::from(query)),
69 page: None,
70 page_size: None,
71 order_by: None,
72 }
73 }
74}
75
76impl Client {
77 pub async fn get_set(&self, request: GetSetRequest) -> Result<Set, ClientError> {
81 let set = self
82 .http_client
83 .get(format!("{}/sets/{}", self.base_url, request.id))
84 .send()
85 .await?
86 .json::<ApiResult<Set>>()
87 .await?;
88
89 Client::parse_response(set)
90 }
91
92 pub async fn search_sets(&self, request: SearchSetsRequest) -> Result<Vec<Set>, ClientError> {
96 let sets = self
97 .http_client
98 .get(format!("{}/sets", self.base_url))
99 .query(&[
100 ("q", request.query),
101 ("page", request.page.map(|p| p.to_string())),
102 ("pageSize", request.page_size.map(|p| p.to_string())),
103 ("orderBy", request.order_by),
104 ])
105 .send()
106 .await?
107 .json::<ApiResult<Vec<Set>>>()
108 .await?;
109
110 Client::parse_response(sets)
111 }
112
113 pub async fn get_all_sets(&self) -> Result<Vec<Set>, ClientError> {
115 let mut page = 1;
116 let page_size = 250;
117 let mut total_pages: usize = 0;
118 let mut sets: Vec<Set> = vec![];
119
120 loop {
121 let resp = self
122 .http_client
123 .get(format!("{}/sets", self.base_url))
124 .query(&[("page", page)])
125 .send()
126 .await?
127 .json::<ApiResult<Vec<Set>>>()
128 .await?;
129
130 let total_count = if let ApiResult::Ok(ev) = &resp {
131 ev.total_count
132 } else {
133 None
134 };
135
136 match Client::parse_response(resp) {
137 Ok(mut cv) => {
138 sets.append(&mut cv);
139 if sets.len() % page_size != 0 {
140 break;
141 }
142 if let Some(tc) = total_count {
143 total_pages = ((tc / page_size) as f64).ceil() as usize;
144 }
145
146 if page > total_pages {
147 break;
148 }
149
150 page += 1;
151 }
152 Err(e) => {
153 return Err(e);
154 }
155 };
156 }
157
158 Ok(sets)
159 }
160}