open_library_api_rs/api/
subjects.rs1use crate::client::OpenLibraryClient;
3use crate::error::Result;
4use crate::models::search::SubjectParams;
5use crate::models::subject::Subject;
6use crate::validation::{validate_limit, validate_subject_slug};
7
8impl OpenLibraryClient {
9 pub async fn get_subject(&self, slug: &str, params: SubjectParams) -> Result<Subject> {
16 validate_subject_slug(slug)?;
17 if let Some(l) = params.limit { validate_limit(l)?; }
18
19 let mut url = self.base_url.join(&format!("subjects/{slug}.json"))?;
20 let has_params = params.details.is_some()
21 || params.ebooks.is_some()
22 || params.published_in.is_some()
23 || params.limit.is_some()
24 || params.offset.is_some();
25 if has_params {
26 let mut qp = url.query_pairs_mut();
27 if let Some(v) = params.details {
28 qp.append_pair("details", if v { "true" } else { "false" });
29 }
30 if let Some(v) = params.ebooks {
31 qp.append_pair("ebooks", if v { "true" } else { "false" });
32 }
33 if let Some(v) = params.published_in.as_deref() {
34 qp.append_pair("published_in", v);
35 }
36 if let Some(v) = params.limit { qp.append_pair("limit", &v.to_string()); }
37 if let Some(v) = params.offset { qp.append_pair("offset", &v.to_string()); }
38 }
39 self.get_json(url).await
40 }
41}