open_library_api_rs/api/
covers.rs1use url::Url;
3
4use crate::client::OpenLibraryClient;
5use crate::error::Result;
6use crate::models::common::{CoverKey, ImageSize};
7use crate::models::covers::CoverMeta;
8use crate::validation::validate_author_id;
9
10impl OpenLibraryClient {
11 pub fn cover_url(&self, key: CoverKey, value: &str, size: ImageSize) -> Url {
16 let path = format!(
17 "b/{}/{}-{}.jpg",
18 key.as_str(),
19 value,
20 size.as_str()
21 );
22 self.covers_url.join(&path).expect("cover URL construction failed")
24 }
25
26 pub fn author_photo_url(&self, olid: &str, size: ImageSize) -> Result<Url> {
30 validate_author_id(olid)?;
31 let path = format!("a/olid/{olid}-{}.jpg", size.as_str());
32 Ok(self.covers_url.join(&path).expect("author photo URL construction failed"))
33 }
34
35 pub async fn cover_meta(
39 &self,
40 key: CoverKey,
41 value: &str,
42 ) -> Result<Vec<CoverMeta>> {
43 let path = format!("b/{}/{}.json", key.as_str(), value);
44 let url = self.covers_url.join(&path)?;
45 let raw: serde_json::Value = self.get_covers_json(url).await?;
47 let metas: Vec<CoverMeta> = raw
48 .as_object()
49 .and_then(|m| m.values().next())
50 .and_then(|v| serde_json::from_value(v.clone()).ok())
51 .unwrap_or_default();
52 Ok(metas)
53 }
54}