Skip to main content

open_library_api_rs/api/
books.rs

1// v0.0.1
2use std::collections::HashMap;
3
4use crate::client::OpenLibraryClient;
5use crate::error::Result;
6use crate::models::common::BooksJsCmd;
7use crate::models::query::BooksApiEntry;
8use crate::validation::validate_bibkeys;
9
10impl OpenLibraryClient {
11    /// Query the `/api/books` endpoint using bibliographic keys.
12    ///
13    /// `bibkeys` is a list of strings like `"ISBN:0451450523"`, `"OCLC:45883427"`,
14    /// `"LCCN:2004046975"`, `"OLID:OL7408846M"`, or `"ID:5428012"`.
15    ///
16    /// `jscmd` controls how much data is returned (`Data`, `Details`, or `ViewApi`).
17    pub async fn get_books(
18        &self,
19        bibkeys: &[String],
20        jscmd: BooksJsCmd,
21    ) -> Result<HashMap<String, BooksApiEntry>> {
22        validate_bibkeys(bibkeys)?;
23        let joined = bibkeys.join("|");
24        let mut url = self.base_url.join("api/books")?;
25        url.query_pairs_mut()
26            .append_pair("bibkeys", &joined)
27            .append_pair("jscmd", jscmd.as_str())
28            .append_pair("format", "json");
29        self.get_json(url).await
30    }
31}