use crate::{errors::HackerNewsResult, http::InternalHttpClient, HackerNewsID};
use super::{HackerNewsItemList, HackerNewsUpdatedItems};
#[derive(Debug)]
pub struct HackerNewsRealtimeClient {
internal_client: InternalHttpClient,
}
const MAX_ITEM_ENDPOINT: &str = "maxitem";
const TOP_STORIES_ENDPOINT: &str = "topstories";
const NEW_STORIES_ENDPOINT: &str = "newstories";
const BEST_STORIES_ENDPOINT: &str = "beststories";
const ASK_STORIES_ENDPOINT: &str = "askstories";
const SHOW_STORIES_ENDPOINT: &str = "showstories";
const JOB_STORIES_ENDPOINT: &str = "jobstories";
const UPDATES_ENDPOINT: &str = "updates";
impl HackerNewsRealtimeClient {
pub fn new(internal_client: InternalHttpClient) -> Self {
Self { internal_client }
}
async fn get_realtime_story_data(
&self,
endpoint: &str,
) -> HackerNewsResult<HackerNewsItemList> {
let stories = self.internal_client.get_item(endpoint).await?;
Ok(stories)
}
pub async fn get_latest_item_id(&self) -> HackerNewsResult<HackerNewsID> {
let item_id = self.internal_client.get_item(MAX_ITEM_ENDPOINT).await?;
Ok(item_id)
}
pub async fn get_top_stories(&self) -> HackerNewsResult<HackerNewsItemList> {
self.get_realtime_story_data(TOP_STORIES_ENDPOINT).await
}
pub async fn get_latest_stories(&self) -> HackerNewsResult<HackerNewsItemList> {
self.get_realtime_story_data(NEW_STORIES_ENDPOINT).await
}
pub async fn get_best_stories(&self) -> HackerNewsResult<HackerNewsItemList> {
self.get_realtime_story_data(BEST_STORIES_ENDPOINT).await
}
pub async fn get_ask_hacker_news_stories(&self) -> HackerNewsResult<HackerNewsItemList> {
self.get_realtime_story_data(ASK_STORIES_ENDPOINT).await
}
pub async fn get_show_hacker_news_stories(&self) -> HackerNewsResult<HackerNewsItemList> {
self.get_realtime_story_data(SHOW_STORIES_ENDPOINT).await
}
pub async fn get_job_hacker_news_stories(&self) -> HackerNewsResult<HackerNewsItemList> {
self.get_realtime_story_data(JOB_STORIES_ENDPOINT).await
}
pub async fn get_recently_updated_items(&self) -> HackerNewsResult<HackerNewsItemList> {
let updated_items: HackerNewsUpdatedItems =
self.internal_client.get_item(UPDATES_ENDPOINT).await?;
Ok(updated_items.items)
}
pub async fn get_recently_updated_profiles(&self) -> HackerNewsResult<HackerNewsItemList> {
let updated_items: HackerNewsUpdatedItems =
self.internal_client.get_item(UPDATES_ENDPOINT).await?;
Ok(updated_items.profiles)
}
}