open_library_api_rs/api/
works.rs1use 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 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 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 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 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}