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::work::{Work, WorkBookshelves, WorkEditions, WorkRatings};
use crate::validation::{validate_limit, validate_work_id};

impl OpenLibraryClient {
    /// Fetch a Work by its Open Library ID (e.g. `"OL45804W"`).
    pub async fn get_work(&self, id: &str) -> Result<Work> {
        validate_work_id(id)?;
        let url = self.base_url.join(&format!("works/{id}.json"))?;
        self.get_json(url).await
    }

    /// Fetch the editions belonging to a Work.
    pub async fn get_work_editions(
        &self,
        id: &str,
        limit: u32,
        offset: u32,
    ) -> Result<WorkEditions> {
        validate_work_id(id)?;
        validate_limit(limit)?;
        let mut url = self.base_url.join(&format!("works/{id}/editions.json"))?;
        url.query_pairs_mut()
            .append_pair("limit", &limit.to_string())
            .append_pair("offset", &offset.to_string());
        self.get_json(url).await
    }

    /// Fetch community ratings for a Work.
    pub async fn get_work_ratings(&self, id: &str) -> Result<WorkRatings> {
        validate_work_id(id)?;
        let url = self.base_url.join(&format!("works/{id}/ratings.json"))?;
        self.get_json(url).await
    }

    /// Fetch bookshelf counts (want-to-read, currently reading, already read) for a Work.
    pub async fn get_work_bookshelves(&self, id: &str) -> Result<WorkBookshelves> {
        validate_work_id(id)?;
        let url = self.base_url.join(&format!("works/{id}/bookshelves.json"))?;
        self.get_json(url).await
    }
}