use url::Url;
use crate::client::OpenLibraryClient;
use crate::error::Result;
use crate::models::common::{CoverKey, ImageSize};
use crate::models::covers::CoverMeta;
use crate::validation::validate_author_id;
impl OpenLibraryClient {
pub fn cover_url(&self, key: CoverKey, value: &str, size: ImageSize) -> Url {
let path = format!(
"b/{}/{}-{}.jpg",
key.as_str(),
value,
size.as_str()
);
self.covers_url.join(&path).expect("cover URL construction failed")
}
pub fn author_photo_url(&self, olid: &str, size: ImageSize) -> Result<Url> {
validate_author_id(olid)?;
let path = format!("a/olid/{olid}-{}.jpg", size.as_str());
Ok(self.covers_url.join(&path).expect("author photo URL construction failed"))
}
pub async fn cover_meta(
&self,
key: CoverKey,
value: &str,
) -> Result<Vec<CoverMeta>> {
let path = format!("b/{}/{}.json", key.as_str(), value);
let url = self.covers_url.join(&path)?;
let raw: serde_json::Value = self.get_covers_json(url).await?;
let metas: Vec<CoverMeta> = raw
.as_object()
.and_then(|m| m.values().next())
.and_then(|v| serde_json::from_value(v.clone()).ok())
.unwrap_or_default();
Ok(metas)
}
}