osars 0.3.1

Rust client library for OpenScheduleAPI - educational schedule management system
Documentation
use crate::{Campus, Client, College, api::groups::GroupsQuery, error::Result};
use urlencoding::encode;

pub struct CollegesQuery<'a> {
    client: &'a Client,
    name: Option<String>,
}

impl<'a> CollegesQuery<'a> {
    pub fn new(client: &'a Client) -> Self {
        Self { client, name: None }
    }

    pub fn name(mut self, name: &str) -> Self {
        self.name = Some(name.to_string());
        self
    }

    pub async fn send(self) -> Result<Vec<College>> {
        let path = if let Some(name) = self.name {
            format!("/colleges?name={}", name)
        } else {
            "/colleges".to_string()
        };
        self.client.get_json(&path).await
    }

    pub fn college(self, college_id: u32) -> CollegeQuery<'a> {
        CollegeQuery::new(self.client, college_id)
    }
}

#[derive(Debug)]
pub struct CollegeQuery<'a> {
    client: &'a Client,
    college_id: u32,
}

impl<'a> CollegeQuery<'a> {
    pub fn new(client: &'a Client, college_id: u32) -> Self {
        Self { client, college_id }
    }
    pub async fn get(self) -> Result<College> {
        self.client
            .get_json(&format!("/colleges/{}", self.college_id))
            .await
    }

    pub fn campuses(self) -> CampusesQuery<'a> {
        CampusesQuery::new(self.client, self.college_id)
    }

    pub fn campus(self, campus_id: u32) -> CampusQuery<'a> {
        CampusQuery::new(self.client, campus_id)
    }
}

pub struct CampusesQuery<'a> {
    client: &'a Client,
    college_id: u32,
    name: Option<String>,
}

impl<'a> CampusesQuery<'a> {
    pub fn new(client: &'a Client, college_id: u32) -> Self {
        Self {
            client,
            college_id,
            name: None,
        }
    }

    pub fn name(mut self, name: &str) -> Self {
        self.name = Some(name.to_string());
        self
    }

    pub async fn send(self) -> Result<Vec<Campus>> {
        let mut url = format!("/colleges/{}/campuses", self.college_id);

        if let Some(name) = self.name {
            url = format!("{}?name={}", url, encode(&name));
        }
        self.client.get_json(&url).await
    }

    pub fn campus(self, campus_id: u32) -> CampusQuery<'a> {
        CampusQuery::new(self.client, campus_id)
    }
}

pub struct CampusQuery<'a> {
    client: &'a Client,
    campus_id: u32,
}

impl<'a> CampusQuery<'a> {
    pub fn new(client: &'a Client, campus_id: u32) -> Self {
        Self { client, campus_id }
    }

    pub async fn get(self) -> Result<Campus> {
        self.client
            .get_json(&format!("/campuses/{}", self.campus_id))
            .await
    }

    pub fn groups(self) -> GroupsQuery<'a> {
        GroupsQuery::new(self.client, self.campus_id)
    }
    pub fn group(self, group_id: u32) -> crate::api::groups::GroupQuery<'a> {
        crate::api::groups::GroupQuery::new(self.client, group_id)
    }
}