use std::time::Duration;
use crate::{
http::InternalHttpClient, items::client::HackerNewsItemClient,
realtime::client::HackerNewsRealtimeClient, users::client::HackerNewsUserClient,
};
#[derive(Debug, Clone, Copy)]
pub enum ApiVersion {
V0,
}
const USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"),);
const API_BASE_URL: &str = "https://hacker-news.firebaseio.com/v0";
const DEFAULT_TIMEOUT_SECONDS: u64 = 10;
#[derive(Debug)]
pub struct HackerNewsClient {
pub items: HackerNewsItemClient,
pub users: HackerNewsUserClient,
pub realtime: HackerNewsRealtimeClient,
pub version: ApiVersion,
}
impl Default for HackerNewsClient {
fn default() -> Self {
Self::new()
}
}
impl HackerNewsClient {
fn new_client(timeout: std::time::Duration) -> Self {
let client = reqwest::ClientBuilder::new()
.timeout(timeout)
.user_agent(USER_AGENT)
.build()
.unwrap();
let internal_client = InternalHttpClient::new(client, API_BASE_URL);
let item_client = HackerNewsItemClient::new(internal_client.clone());
let user_client: HackerNewsUserClient = HackerNewsUserClient::new(internal_client.clone());
let realtime_client = HackerNewsRealtimeClient::new(internal_client);
Self {
items: item_client,
users: user_client,
realtime: realtime_client,
version: ApiVersion::V0,
}
}
pub fn new() -> Self {
let duration = std::time::Duration::from_secs(DEFAULT_TIMEOUT_SECONDS);
Self::new_client(duration)
}
pub fn new_with_timeout_secs(timeout: u64) -> Self {
let duration = std::time::Duration::from_secs(timeout);
Self::new_client(duration)
}
pub fn new_with_timeout_duration(duration: Duration) -> Self {
Self::new_client(duration)
}
}