use oid::Oid; use serde::{Deserialize, Serialize}; use crate::test::storage::{self, Storage}; use super::Name; #[derive(Clone, Debug, PartialEq, Eq)] pub struct Person { pub payload: Payload, pub content_id: Oid, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Payload { name: Name, key: crypto::PublicKey, } impl Person { pub fn new( repo: &Storage, name: &str, key: crypto::PublicKey, ) -> Result { let repo = repo.as_raw(); let refname = format!("refs/rad/identities/{name}"); let payload = Payload { name: Name(name.to_owned()), key, }; let blob = serde_json::to_vec(&payload)?; let oid = repo.blob(&blob)?; let mut tree = repo.treebuilder(None)?; tree.insert("identity", oid, git2::FileMode::Blob.into())?; let oid = tree.write()?; let tree = repo.find_tree(oid)?; let signature = git2::Signature::now(name, name)?; let content_id = repo .commit( Some(&refname), &signature, &signature, "persisted identity", &tree, &[], )? .into(); Ok(Self { payload, content_id, }) } pub fn name(&self) -> &Name { &self.payload.name } }