modcrawl 0.2.0

Detect, inspect, and analyze Minecraft mods and plugins from JAR files
Documentation
use std::fmt;

use serde::{Deserialize, Serialize};

use crate::error::Result;

pub fn parse(input: &str) -> Result<BukkitPluginMetadata> {
    Ok(serde_saphyr::from_str(input)?)
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BukkitPluginMetadata {
    pub name: String,
    pub version: String,
    pub main: String,
    #[serde(rename = "api-version")]
    pub api_version: Option<String>,
    #[serde(rename = "folia-supported")]
    pub folia_supported: Option<bool>,
    #[serde(default)]
    pub softdepend: Vec<String>,
    pub load: Option<String>,
    #[serde(default)]
    pub authors: Vec<String>,
    pub description: Option<String>,
    pub website: Option<String>,
    pub author: Option<String>,
    pub prefix: Option<String>,
    #[serde(default)]
    pub loadbefore: Vec<String>,
    #[serde(default)]
    pub depend: Vec<String>,
}

impl fmt::Display for BukkitPluginMetadata {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        writeln!(f, "Name:     {}", self.name)?;
        writeln!(f, "Version:  {}", self.version)?;
        if let Some(d) = &self.description {
            writeln!(f, "About:    {d}")?;
        }
        if !self.authors.is_empty() {
            writeln!(f, "Authors:  {}", self.authors.join(", "))?;
        }
        if !self.depend.is_empty() {
            writeln!(f, "Depends:  {}", self.depend.join(", "))?;
        }
        Ok(())
    }
}