robotevents 0.6.0

Wrapper for the RobotEvents.com v2 API.
Documentation
pub mod award;
pub mod event;
pub mod location;
pub mod matches;
pub mod ranking;
pub mod season;
pub mod skill;
pub mod team;
pub mod program;

pub use award::*;
pub use event::*;
pub use location::*;
pub use matches::*;
pub use ranking::*;
pub use season::*;
pub use skill::*;
pub use team::*;
pub use program::*;

use crate::{RobotEvents, V2_API_BASE};
use serde::{de::DeserializeOwned, Deserialize, Serialize};

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PageMeta {
    pub current_page: i32,
    pub first_page_url: String,
    pub from: Option<i32>,
    pub to: Option<i32>,
    pub last_page: i32,
    pub last_page_url: String,
    pub prev_page_url: Option<String>,
    pub next_page_url: Option<String>,
    pub path: String,
    pub per_page: i32,
    pub total: i32,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PaginatedResponse<T> {
    pub meta: PageMeta,
    pub data: Vec<T>,
}

impl<T: DeserializeOwned> PaginatedResponse<T> {
    pub async fn prev_page(
        &self,
        robotevents: &RobotEvents,
    ) -> Option<Result<PaginatedResponse<T>, reqwest::Error>> {
        if let Some(url) = &self.meta.prev_page_url {
            match robotevents
                .request(url.trim_start_matches(V2_API_BASE))
                .await
            {
                Ok(response) => match response.json().await {
                    Ok(json) => Some(Ok(json)),
                    Err(error) => Some(Err(error)),
                },
                Err(error) => Some(Err(error)),
            }
        } else {
            None
        }
    }

    pub async fn next_page(
        &self,
        robotevents: &RobotEvents,
    ) -> Option<Result<PaginatedResponse<T>, reqwest::Error>> {
        if let Some(url) = &self.meta.next_page_url {
            match robotevents
                .request(url.trim_start_matches(V2_API_BASE))
                .await
            {
                Ok(response) => match response.json().await {
                    Ok(json) => Some(Ok(json)),
                    Err(error) => Some(Err(error)),
                },
                Err(error) => Some(Err(error)),
            }
        } else {
            None
        }
    }

    pub async fn first_page(
        &self,
        robotevents: &RobotEvents,
    ) -> Result<PaginatedResponse<T>, reqwest::Error> {
        robotevents
            .request(self.meta.first_page_url.trim_start_matches(V2_API_BASE))
            .await?
            .json()
            .await
    }

    pub async fn last_page(
        &self,
        robotevents: &RobotEvents,
    ) -> Result<PaginatedResponse<T>, reqwest::Error> {
        robotevents
            .request(self.meta.last_page_url.trim_start_matches(V2_API_BASE))
            .await?
            .json()
            .await
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IdInfo {
    pub id: i32,
    pub name: String,
    pub code: Option<String>,
}