sigmate 1.0.0

A modern, developer-focused CLI for cryptographic file signing and verification.
Documentation
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;

#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct ToolMetadata {
    pub name: String,
    pub version: String,
    pub language: String,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct SignatureMetadata {
    pub file: PathBuf,
    pub relpath: PathBuf,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub abspath: Option<PathBuf>,
    pub created_at: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expires_at: Option<String>,
    pub tool: ToolMetadata,
    pub signer_identity: String,
    pub signer_host: String,
    pub signature_algorithm: String,
    pub hash_algorithm: String,
    pub file_hash: String,
    pub signature: String,
    pub signature_hash: String,
    pub key_fingerprint: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub signature_file: Option<PathBuf>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub version: Option<HashMap<String, GitInfo>>,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct GitInfo {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
    #[serde(rename = "ref", skip_serializing_if = "Option::is_none")]
    pub r#ref: Option<String>,
}