use console::style; use serde::Deserialize; use std::collections::HashMap; #[derive(Deserialize, Debug)] pub struct SearchResponse { pub hits: Vec, pub offset: isize, pub limit: isize, pub total_hits: isize, } #[derive(Deserialize, Debug)] pub struct ModResult { pub slug: String, pub title: String, pub description: String, pub categories: Vec, pub display_categories: Vec, // NOTE this is not in the OpenAPI docs pub client_side: String, pub server_side: String, pub project_type: String, // NOTE this isn't in all search results? pub downloads: isize, pub icon_url: String, pub project_id: String, // TODO parse to 'local-xxxx' with reegex pub author: String, pub versions: Vec, pub follows: isize, pub date_created: String, pub date_modified: String, pub latest_version: String, pub license: String, pub gallery: Vec, } impl ModResult { pub fn format_info(&self) -> String { let title = style(self.title.clone()).bold(); let downloads = style(self.downloads.clone()).bold().green(); if let Some(latest_release) = self.versions.last() { // TODO fetch version numbers to display let latest_release = style(latest_release).bold().blue(); format!("{} [{}] ({} downloads)", title, latest_release, downloads) } else { format!("{} [no releases]", title) } } pub fn format_description(&self) -> String { self.description.to_owned() } pub fn display(&self, index: usize) { let index = style(index).magenta(); let info = self.format_info(); let description = self.format_description(); println!("{:>2} {}\n {}", index, info, description); } } #[derive(Deserialize, Debug)] pub struct ModInfo { pub slug: String, pub title: String, pub description: String, pub categories: Vec, pub additional_categories: Vec, // NOTE not listed in OpenAPI docs pub client_side: String, // TODO serialize as enum pub server_side: String, // TODO serialize as enum pub body: String, pub issues_url: Option, pub source_url: Option, pub wiki_url: Option, pub discord_url: Option, pub donation_urls: Option>, pub project_type: String, pub downloads: isize, pub icon_url: Option, pub id: String, // TODO serialize mod id? pub team: String, // TODO serialize team id? pub body_url: Option, // NOTE deprecated pub moderator_message: Option, pub published: String, // TODO serialize as datetime pub updated: String, // TODO serialize as datetime pub approved: Option, // NOTE not listed in OpenAPI docs, TODO serialize as datetime pub followers: isize, pub status: String, pub license: License, pub versions: Vec, pub gallery: Option>, } #[derive(Deserialize, Debug)] pub struct GalleryEntry { pub url: String, pub featured: bool, pub title: String, pub description: String, pub created: String, } #[derive(Deserialize, Debug)] pub struct License { pub id: String, pub name: String, pub url: String, } #[derive(Deserialize, Debug)] pub struct DonationLink { pub id: String, pub platform: String, pub url: String, } #[derive(Deserialize, Debug)] pub struct ModVersion { pub name: String, pub version_number: String, pub changelog: Option, // pub dependencies: Option>, // TODO dependency wrangling, thank you modrinth, very cool pub game_versions: Vec, pub version_type: String, // TODO {alpha | beta | release} pub loaders: Vec, pub featured: bool, pub id: String, // version id pub project_id: String, // mod id pub author_id: String, // user id pub date_published: String, // TODO serialize datetime pub downloads: isize, pub changelog_url: Option, // NOTE deprecated pub files: Vec, } #[derive(Deserialize, Debug)] pub struct ModVersionFile { pub hashes: HashMap, pub url: String, pub filename: String, pub primary: bool, pub size: isize, }