use crate::client::OpenLibraryClient;
use crate::error::Result;
use crate::models::search::SubjectParams;
use crate::models::subject::Subject;
use crate::validation::{validate_limit, validate_subject_slug};
impl OpenLibraryClient {
pub async fn get_subject(&self, slug: &str, params: SubjectParams) -> Result<Subject> {
validate_subject_slug(slug)?;
if let Some(l) = params.limit { validate_limit(l)?; }
let mut url = self.base_url.join(&format!("subjects/{slug}.json"))?;
let has_params = params.details.is_some()
|| params.ebooks.is_some()
|| params.published_in.is_some()
|| params.limit.is_some()
|| params.offset.is_some();
if has_params {
let mut qp = url.query_pairs_mut();
if let Some(v) = params.details {
qp.append_pair("details", if v { "true" } else { "false" });
}
if let Some(v) = params.ebooks {
qp.append_pair("ebooks", if v { "true" } else { "false" });
}
if let Some(v) = params.published_in.as_deref() {
qp.append_pair("published_in", v);
}
if let Some(v) = params.limit { qp.append_pair("limit", &v.to_string()); }
if let Some(v) = params.offset { qp.append_pair("offset", &v.to_string()); }
}
self.get_json(url).await
}
}