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::list::{List, ListEditions, ListSeeds, ListSubjects, UserLists};
use crate::validation::{validate_limit, validate_list_id, validate_username};

impl OpenLibraryClient {
    /// Fetch all public lists belonging to a user.
    pub async fn get_user_lists(
        &self,
        username: &str,
        limit: u32,
        offset: u32,
    ) -> Result<UserLists> {
        validate_username(username)?;
        validate_limit(limit)?;
        let mut url = self
            .base_url
            .join(&format!("people/{username}/lists.json"))?;
        url.query_pairs_mut()
            .append_pair("limit", &limit.to_string())
            .append_pair("offset", &offset.to_string());
        self.get_json(url).await
    }

    /// Fetch a single list.
    pub async fn get_list(&self, username: &str, list_id: &str) -> Result<List> {
        validate_username(username)?;
        validate_list_id(list_id)?;
        let url = self
            .base_url
            .join(&format!("people/{username}/lists/{list_id}.json"))?;
        self.get_json(url).await
    }

    /// Fetch the editions contained in a list.
    pub async fn get_list_editions(
        &self,
        username: &str,
        list_id: &str,
        limit: u32,
        offset: u32,
    ) -> Result<ListEditions> {
        validate_username(username)?;
        validate_list_id(list_id)?;
        validate_limit(limit)?;
        let mut url = self
            .base_url
            .join(&format!("people/{username}/lists/{list_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 the subjects covered by a list.
    pub async fn get_list_subjects(&self, username: &str, list_id: &str) -> Result<ListSubjects> {
        validate_username(username)?;
        validate_list_id(list_id)?;
        let url = self
            .base_url
            .join(&format!("people/{username}/lists/{list_id}/subjects.json"))?;
        self.get_json(url).await
    }

    /// Fetch the seeds (raw items) in a list.
    pub async fn get_list_seeds(&self, username: &str, list_id: &str) -> Result<ListSeeds> {
        validate_username(username)?;
        validate_list_id(list_id)?;
        let url = self
            .base_url
            .join(&format!("people/{username}/lists/{list_id}/seeds.json"))?;
        self.get_json(url).await
    }
}