use crate::{
errors::{HackerNewsClientError, HackerNewsResult},
http::InternalHttpClient,
HackerNewsID,
};
use super::{
comments::HackerNewsComment, jobs::HackerNewsJob, poll_options::HackerNewsPollOption,
polls::HackerNewsPoll, stories::HackerNewsStory, HackerNewsItem,
};
const ITEM_ENDPOINT: &str = "item";
#[derive(Debug)]
pub struct HackerNewsItemClient {
internal_client: InternalHttpClient,
}
impl HackerNewsItemClient {
pub fn new(internal_client: InternalHttpClient) -> Self {
Self { internal_client }
}
pub async fn get_item(&self, id: HackerNewsID) -> HackerNewsResult<HackerNewsItem> {
let item = self
.internal_client
.get_item_with_id(ITEM_ENDPOINT, id)
.await?;
Ok(item)
}
async fn get_typed_item<T>(&self, id: HackerNewsID) -> HackerNewsResult<T>
where
HackerNewsClientError: From<<T as TryFrom<HackerNewsItem>>::Error>,
T: TryFrom<HackerNewsItem>,
{
let item = self.get_item(id).await?;
let typed_item = item.try_into()?;
Ok(typed_item)
}
pub async fn get_story(&self, id: HackerNewsID) -> HackerNewsResult<HackerNewsStory> {
self.get_typed_item(id).await
}
pub async fn get_comment(&self, id: HackerNewsID) -> HackerNewsResult<HackerNewsComment> {
self.get_typed_item(id).await
}
pub async fn get_job(&self, id: HackerNewsID) -> HackerNewsResult<HackerNewsJob> {
self.get_typed_item(id).await
}
pub async fn get_poll(&self, id: HackerNewsID) -> HackerNewsResult<HackerNewsPoll> {
self.get_typed_item(id).await
}
pub async fn get_poll_option(
&self,
id: HackerNewsID,
) -> HackerNewsResult<HackerNewsPollOption> {
self.get_typed_item(id).await
}
}