Skip to main content

open_library_api_rs/api/
works.rs

1// v0.0.1
2use crate::client::OpenLibraryClient;
3use crate::error::Result;
4use crate::models::work::{Work, WorkBookshelves, WorkEditions, WorkRatings};
5use crate::validation::{validate_limit, validate_work_id};
6
7impl OpenLibraryClient {
8    /// Fetch a Work by its Open Library ID (e.g. `"OL45804W"`).
9    pub async fn get_work(&self, id: &str) -> Result<Work> {
10        validate_work_id(id)?;
11        let url = self.base_url.join(&format!("works/{id}.json"))?;
12        self.get_json(url).await
13    }
14
15    /// Fetch the editions belonging to a Work.
16    pub async fn get_work_editions(
17        &self,
18        id: &str,
19        limit: u32,
20        offset: u32,
21    ) -> Result<WorkEditions> {
22        validate_work_id(id)?;
23        validate_limit(limit)?;
24        let mut url = self.base_url.join(&format!("works/{id}/editions.json"))?;
25        url.query_pairs_mut()
26            .append_pair("limit", &limit.to_string())
27            .append_pair("offset", &offset.to_string());
28        self.get_json(url).await
29    }
30
31    /// Fetch community ratings for a Work.
32    pub async fn get_work_ratings(&self, id: &str) -> Result<WorkRatings> {
33        validate_work_id(id)?;
34        let url = self.base_url.join(&format!("works/{id}/ratings.json"))?;
35        self.get_json(url).await
36    }
37
38    /// Fetch bookshelf counts (want-to-read, currently reading, already read) for a Work.
39    pub async fn get_work_bookshelves(&self, id: &str) -> Result<WorkBookshelves> {
40        validate_work_id(id)?;
41        let url = self.base_url.join(&format!("works/{id}/bookshelves.json"))?;
42        self.get_json(url).await
43    }
44}