shard-core 2.0.0

Core library for shard distributed VCS: chunking, compression, commits, branching, merging, WAL
Documentation
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Commit {
    pub commit_id: String,
    pub parents: Vec<String>,
    pub manifests: Vec<String>,
    pub author: String,
    pub message: String,
    pub timestamp: u64,
    pub public_key: Option<String>,
    pub signature: Option<String>,
    #[serde(default)]
    pub key_id: Option<String>,
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_commit_serialization_roundtrip() {
        let c = Commit {
            commit_id: "abc".into(),
            parents: vec!["parent1".into()],
            manifests: vec!["man1".into()],
            author: "Test".into(),
            message: "test message".into(),
            timestamp: 1000,
            public_key: Some("pk".into()),
            signature: Some("sig".into()),
            key_id: Some("key1".into()),
        };
        let json = serde_json::to_vec(&c).unwrap();
        let c2: Commit = serde_json::from_slice(&json).unwrap();
        assert_eq!(c.commit_id, c2.commit_id);
        assert_eq!(c.author, c2.author);
        assert_eq!(c.message, c2.message);
        assert_eq!(c.timestamp, c2.timestamp);
        assert_eq!(c.key_id, c2.key_id);
    }

    #[test]
    fn test_commit_key_id_backward_compat() {
        let json = r#"{"commit_id":"x","parents":[],"manifests":[],"author":"A","message":"M","timestamp":0}"#;
        let c: Commit = serde_json::from_str(json).unwrap();
        assert!(c.key_id.is_none());
        assert_eq!(c.commit_id, "x");
    }

    #[test]
    fn test_commit_empty_parents() {
        let c = Commit {
            commit_id: "root".into(),
            parents: vec![],
            manifests: vec![],
            author: "Root".into(),
            message: "root commit".into(),
            timestamp: 0,
            public_key: None,
            signature: None,
            key_id: None,
        };
        assert!(c.parents.is_empty());
        assert!(c.public_key.is_none());
    }

    #[test]
    fn test_commit_with_all_fields() {
        let c = Commit {
            commit_id: "full".into(),
            parents: vec!["p1".into(), "p2".into()],
            manifests: vec!["m1".into(), "m2".into(), "m3".into()],
            author: "Author <a@b.com>".into(),
            message: "merge commit".into(),
            timestamp: 1234567890,
            public_key: Some("pkhex".into()),
            signature: Some("sighex".into()),
            key_id: Some("keyid".into()),
        };
        let json = serde_json::to_string_pretty(&c).unwrap();
        let c2: Commit = serde_json::from_str(&json).unwrap();
        assert_eq!(c2.parents.len(), 2);
        assert_eq!(c2.manifests.len(), 3);
    }
}