wormhole-common 0.2.0

Common code for the Wormhole mod manager project.
Documentation
use serde::{Deserialize, Serialize};
use std::time::Instant;

use crate::models::latest::LatestSchema;

use super::schema::browse::{BrowseResult, ModInfo};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SpaceDockAPI {
    pub base: String,
    pub api_base: String,
}

impl Default for SpaceDockAPI {
    fn default() -> Self {
        return Self::new();
    }
}

impl SpaceDockAPI {
    pub fn new() -> Self {
        return Self {
            base: SpaceDockAPI::get_default_url(),
            api_base: SpaceDockAPI::get_default_api_url(),
        };
    }

    pub fn get_default_api_url() -> String {
        return "https://spacedock.info/api".to_string();
    }

    pub fn get_default_url() -> String {
        return "https://spacedock.info".to_string();
    }

    pub async fn get_mod(&self, id: i32) -> ModInfo {
        let uri = format!("{}/mod/{}", self.api_base, id);
        let resp = reqwest::get(uri).await.unwrap();
        let data = resp.json::<ModInfo>().await.unwrap();

        return data.finish(false);
    }

    pub async fn get_mods(&self, page: i32, count: i32) -> BrowseResult {
        let uri = format!("{}/browse?page={}&count={}", self.api_base, page, count);
        let resp = reqwest::get(uri).await.unwrap();
        let data = resp.json::<BrowseResult>().await.unwrap();

        return data.finish();
    }

    pub async fn get_mods_for_game(&self, game: i32, page: i32, count: i32) -> BrowseResult {
        let start_time = Instant::now();

        let uri = format!(
            "{}/browse?page={}&count={}&game_id={}",
            self.api_base, page, count, game
        );
        let resp = reqwest::get(uri).await.unwrap();
        let text = resp.text().await.unwrap();
        let data = serde_json::from_str::<BrowseResult>(&text);

        let elapsed = start_time.elapsed();
        println!("API call took {:?}", elapsed);

        if let Ok(data) = data {
            return data.finish();
        }

        panic!("Found: {}", text);
    }

    pub async fn get_mod_download(&self, id: i32) -> String {
        let uri = format!("{}/mod/{}/latest", self.api_base, id);
        let resp = reqwest::get(uri).await.unwrap();
        let text = resp.text().await.unwrap();
        let data = serde_json::from_str::<LatestSchema>(&text).unwrap();

        return format!("{}{}", self.base, data.download_path);
    }
}