use std::{convert::Infallible, num::ParseIntError};
use thiserror::Error;
use crate::{
items::{HackerNewsItem, HackerNewsItemType},
HackerNewsID,
};
pub type HackerNewsResult<T> = Result<T, HackerNewsClientError>;
#[derive(Debug, Error)]
pub enum HackerNewsClientError {
#[error("{0}")]
RequestError(#[from] reqwest::Error),
#[error("The requested item was not a valid {0} type.")]
InvalidTypeMapping(HackerNewsItemType),
#[error("An associated parent was not found for item {0}")]
AssociatedParentNotFound(HackerNewsID),
#[error("An implicit conversion could not be performed for the item {0}.")]
ImplicitConversionError(HackerNewsItemType),
#[error("Could not convert the response into a valid ID.")]
InvalidIdentifier(#[from] ParseIntError),
#[error("Item or user {0} was not found.")]
ItemOrUserNotFound(String),
#[error(
"An infallible operation has occurred. If you're seeing this, please report an issue!"
)]
InfallibleOperation,
}
impl<T> From<HackerNewsItem> for HackerNewsResult<T> {
fn from(value: HackerNewsItem) -> Self {
Self::Err(HackerNewsClientError::ImplicitConversionError(
value.get_item_type(),
))
}
}
impl From<Infallible> for HackerNewsClientError {
fn from(_: Infallible) -> Self {
Self::InfallibleOperation
}
}