Skip to main content

open_library_api_rs/api/
lists.rs

1// v0.0.1
2use crate::client::OpenLibraryClient;
3use crate::error::Result;
4use crate::models::list::{List, ListEditions, ListSeeds, ListSubjects, UserLists};
5use crate::validation::{validate_limit, validate_list_id, validate_username};
6
7impl OpenLibraryClient {
8    /// Fetch all public lists belonging to a user.
9    pub async fn get_user_lists(
10        &self,
11        username: &str,
12        limit: u32,
13        offset: u32,
14    ) -> Result<UserLists> {
15        validate_username(username)?;
16        validate_limit(limit)?;
17        let mut url = self
18            .base_url
19            .join(&format!("people/{username}/lists.json"))?;
20        url.query_pairs_mut()
21            .append_pair("limit", &limit.to_string())
22            .append_pair("offset", &offset.to_string());
23        self.get_json(url).await
24    }
25
26    /// Fetch a single list.
27    pub async fn get_list(&self, username: &str, list_id: &str) -> Result<List> {
28        validate_username(username)?;
29        validate_list_id(list_id)?;
30        let url = self
31            .base_url
32            .join(&format!("people/{username}/lists/{list_id}.json"))?;
33        self.get_json(url).await
34    }
35
36    /// Fetch the editions contained in a list.
37    pub async fn get_list_editions(
38        &self,
39        username: &str,
40        list_id: &str,
41        limit: u32,
42        offset: u32,
43    ) -> Result<ListEditions> {
44        validate_username(username)?;
45        validate_list_id(list_id)?;
46        validate_limit(limit)?;
47        let mut url = self
48            .base_url
49            .join(&format!("people/{username}/lists/{list_id}/editions.json"))?;
50        url.query_pairs_mut()
51            .append_pair("limit", &limit.to_string())
52            .append_pair("offset", &offset.to_string());
53        self.get_json(url).await
54    }
55
56    /// Fetch the subjects covered by a list.
57    pub async fn get_list_subjects(&self, username: &str, list_id: &str) -> Result<ListSubjects> {
58        validate_username(username)?;
59        validate_list_id(list_id)?;
60        let url = self
61            .base_url
62            .join(&format!("people/{username}/lists/{list_id}/subjects.json"))?;
63        self.get_json(url).await
64    }
65
66    /// Fetch the seeds (raw items) in a list.
67    pub async fn get_list_seeds(&self, username: &str, list_id: &str) -> Result<ListSeeds> {
68        validate_username(username)?;
69        validate_list_id(list_id)?;
70        let url = self
71            .base_url
72            .join(&format!("people/{username}/lists/{list_id}/seeds.json"))?;
73        self.get_json(url).await
74    }
75}