wormhole-common 0.2.0

Common code for the Wormhole mod manager project.
Documentation
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ModVersion {
    pub friendly_version: Option<String>,
    pub game_version: Option<String>,
    pub id: Option<i32>,
    pub created: Option<String>,
    pub download_path: Option<String>,
    pub changelog: Option<String>,
    pub downloads: Option<i32>,
}

impl Default for ModVersion {
    fn default() -> Self {
        return Self {
            friendly_version: None,
            game_version: None,
            id: None,
            created: None,
            download_path: None,
            changelog: None,
            downloads: None,
        };
    }
}

impl ModVersion {
    pub fn finish(&self) -> Self {
        let out = ModVersion {
            friendly_version: Some(self.friendly_version.clone().unwrap_or("".to_string())),
            game_version: Some(self.friendly_version.clone().unwrap_or("".to_string())),
            id: Some(self.id.unwrap_or(0)),
            created: Some(self.created.clone().unwrap_or("".to_string())),
            download_path: Some(self.download_path.clone().unwrap_or("".to_string())),
            changelog: Some(self.changelog.clone().unwrap_or("".to_string())),
            downloads: Some(self.downloads.unwrap_or(0)),
        };

        return out;
    }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ModInfo {
    pub name: Option<String>,
    pub id: Option<i32>,
    pub game: Option<String>,
    pub game_id: Option<i32>,
    pub short_description: Option<String>,
    pub downloads: Option<i32>,
    pub followers: Option<i32>,
    pub author: Option<String>,
    pub default_version_id: Option<i32>,
    pub shared_authors: Option<Vec<Value>>,
    pub background: Option<String>,
    pub bg_offset_y: Option<i32>,
    pub license: Option<String>,
    pub website: Option<String>,
    pub donations: Option<String>,
    pub source_code: Option<String>,
    pub url: Option<String>,
    pub versions: Option<Vec<ModVersion>>,
    pub description: Option<String>,
}

impl Default for ModInfo {
    fn default() -> Self {
        return Self {
            name: None,
            id: None,
            game: None,
            game_id: None,
            short_description: None,
            downloads: None,
            followers: None,
            author: None,
            default_version_id: None,
            shared_authors: None,
            background: None,
            bg_offset_y: None,
            license: None,
            website: None,
            donations: None,
            source_code: None,
            url: None,
            versions: None,
            description: None,
        };
    }
}

impl ModInfo {
    pub fn finish(&self, browse: bool) -> Self {
        let mut out = ModInfo::default();
        let mut _versions = Vec::new();
        let mut bg_img = "https://spacedock.info/static/background.png".to_string();

        if browse {
            bg_img = "https://spacedock.info/static/background-s.png".to_string();
        }

        if let Some(versions) = self.versions.clone() {
            _versions = versions.iter().map(|v| v.finish()).collect();
        }

        out.name = Some(self.name.clone().unwrap_or("".to_string()));
        out.id = Some(self.id.unwrap_or(0));
        out.game = Some(self.game.clone().unwrap_or("".to_string()));
        out.game_id = Some(self.game_id.unwrap_or(0));
        out.short_description = Some(self.short_description.clone().unwrap_or("".to_string()));
        out.downloads = Some(self.downloads.unwrap_or(0));
        out.followers = Some(self.followers.unwrap_or(0));
        out.author = Some(self.author.clone().unwrap_or("".to_string()));
        out.default_version_id = Some(self.default_version_id.unwrap_or(0));
        out.shared_authors = Some(self.shared_authors.clone().unwrap_or(Vec::new()));

        out.background = Some(self.background.clone().unwrap_or(bg_img));

        out.bg_offset_y = Some(self.bg_offset_y.unwrap_or(0));
        out.license = Some(self.license.clone().unwrap_or("".to_string()));
        out.website = Some(self.website.clone().unwrap_or("".to_string()));
        out.donations = Some(self.donations.clone().unwrap_or("".to_string()));
        out.source_code = Some(self.source_code.clone().unwrap_or("".to_string()));
        out.url = Some(self.url.clone().unwrap_or("".to_string()));
        out.versions = Some(_versions);
        out.description = Some(self.description.clone().unwrap_or("".to_string()));

        return out;
    }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct BrowseResult {
    pub result: Option<Vec<ModInfo>>,
    pub count: Option<i32>,
    pub pages: Option<i32>,
    pub page: Option<i32>,
}

impl Default for BrowseResult {
    fn default() -> Self {
        return Self {
            result: None,
            count: None,
            pages: None,
            page: None,
        };
    }
}

impl BrowseResult {
    pub fn finish(&self) -> Self {
        let mut out = BrowseResult::default();
        let mut _res = Vec::new();

        if let Some(result) = self.result.clone() {
            _res = result.iter().map(|v| v.finish(true)).collect();
        }

        out.result = Some(_res);
        out.count = Some(self.count.unwrap_or(0));
        out.pages = Some(self.pages.unwrap_or(0));
        out.page = Some(self.page.unwrap_or(0));

        return out;
    }
}

#[derive(Debug, Deserialize)]
pub struct BrowseModInfo {
    pub name: String,
    pub id: i32,
    pub game: String,
    pub game_id: i32,
    pub short_description: String,
    pub downloads: i32,
    pub followers: i32,
    pub author: String,
    pub default_version_id: i32,
    pub shared_authors: Vec<Value>,
    pub background: String,
    pub bg_offset_y: String,
    pub license: String,
    pub website: String,
    pub donations: String,
    pub source_code: String,
    pub url: String,
    pub versions: Vec<ModVersion>,
}