invar 0.6.0

CLI management tool for modded Minecraft servers
use super::Category;
use crate::index::file::{Hashes, Requirement};
use crate::instance::Loader;
use color_eyre::owo_colors::OwoColorize;
use serde::Deserialize;
use std::fmt;
use url::Url;

#[derive(Deserialize, Debug)]
pub struct File {
    pub hashes: Hashes,
    pub url: Url,
    pub filename: String,
    pub size: usize,
}

#[derive(Deserialize, Debug, Clone, Copy)]
pub struct Metadata {
    #[serde(rename = "project_type")]
    pub category: Category,
    pub client_side: Requirement,
    pub server_side: Requirement,
}

#[derive(Deserialize, Debug)]
pub struct Version {
    pub id: String,
    pub name: String,
    pub game_versions: Vec<String>,
    pub loaders: Vec<Loader>,
    pub date_published: chrono::DateTime<chrono::Utc>,
    pub files: Vec<File>,
}

impl fmt::Display for Version {
    fn fmt(&self, stream: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(
            stream,
            "{name} [ID: {id}] - Supported loaders: {loaders:?}, released: {date}",
            name = self.name.yellow().bold(),
            id = self.id.bold(),
            loaders = self.loaders.bright_red(),
            date = self.date_published.format("%b %e, %Y").bright_blue().bold()
        )?;
        Ok(())
    }
}