open-library-api-rs 0.1.0

Async Rust client for the Open Library API
Documentation
// v0.0.1
use crate::client::OpenLibraryClient;
use crate::error::Result;
use crate::models::search::SubjectParams;
use crate::models::subject::Subject;
use crate::validation::{validate_limit, validate_subject_slug};

impl OpenLibraryClient {
    /// Fetch a Subject by its URL slug (e.g. `"love"`, `"science_fiction"`).
    ///
    /// The slug must be lowercase ASCII letters, digits, and underscores only
    /// (`[a-z0-9_]+`, ≤ 200 chars). Pass `details: Some(true)` in `params` to
    /// receive related subjects, top authors, and top publishers alongside the
    /// work list.
    pub async fn get_subject(&self, slug: &str, params: SubjectParams) -> Result<Subject> {
        validate_subject_slug(slug)?;
        if let Some(l) = params.limit { validate_limit(l)?; }

        let mut url = self.base_url.join(&format!("subjects/{slug}.json"))?;
        let has_params = params.details.is_some()
            || params.ebooks.is_some()
            || params.published_in.is_some()
            || params.limit.is_some()
            || params.offset.is_some();
        if has_params {
            let mut qp = url.query_pairs_mut();
            if let Some(v) = params.details {
                qp.append_pair("details", if v { "true" } else { "false" });
            }
            if let Some(v) = params.ebooks {
                qp.append_pair("ebooks", if v { "true" } else { "false" });
            }
            if let Some(v) = params.published_in.as_deref() {
                qp.append_pair("published_in", v);
            }
            if let Some(v) = params.limit { qp.append_pair("limit", &v.to_string()); }
            if let Some(v) = params.offset { qp.append_pair("offset", &v.to_string()); }
        }
        self.get_json(url).await
    }
}