Skip to main content

open_library_api_rs/api/
subjects.rs

1// v0.0.1
2use 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    /// Fetch a Subject by its URL slug (e.g. `"love"`, `"science_fiction"`).
10    ///
11    /// The slug must be lowercase ASCII letters, digits, and underscores only
12    /// (`[a-z0-9_]+`, ≤ 200 chars). Pass `details: Some(true)` in `params` to
13    /// receive related subjects, top authors, and top publishers alongside the
14    /// work list.
15    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}