use std::marker::PhantomData;
pub mod converter;
pub mod data;
mod tl_extensions;
pub mod request;
pub use request::upcoming::upcoming;
pub use request::results::results;
pub use request::match_page::get_match;
pub trait ConvertCollection
where
Self: Sized,
{
fn convert<'a>(d: &'a tl::VDom<'a>) -> Result<Vec<Self>, crate::Error>;
}
pub trait ConvertInstance
where
Self: Sized,
{
fn convert<'a>(d: &'a tl::VDom<'a>) -> Result<Self, crate::Error>;
}
#[derive(Debug)]
pub struct Request<T>
where
T: ConvertInstance,
{
url: String,
_m: PhantomData<T>,
}
impl<T> Request<T>
where
T: ConvertInstance,
{
pub fn new(url: String) -> Request<T> {
Request::<T> {
url,
_m: PhantomData,
}
}
pub async fn fetch(&self) -> Result<T, Error> {
let html = reqwest::get(self.url.clone()).await?.text().await?;
let vdom = tl::parse(&html, tl::ParserOptions::default())?;
let x = T::convert(&vdom)?;
Ok(x)
}
}
#[derive(Debug)]
pub enum Error {
HTTPError,
ParseError,
ConversionError(&'static str),
}
impl From<reqwest::Error> for Error {
fn from(_: reqwest::Error) -> Self {
Error::HTTPError
}
}
impl From<tl::ParseError> for Error {
fn from(_: tl::ParseError) -> Self {
Error::ParseError
}
}
impl std::error::Error for Error {}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::HTTPError => write!(f, "error with http client or remote server"),
Error::ParseError => write!(f, "error parsing received data"),
Error::ConversionError(_) => write!(f, "error converting data into correct type"),
}
}
}