use super::ObjectId; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TreeEntry { pub name: String, pub kind: TreeEntryKind, pub id: ObjectId, pub mode: u16, pub uid: u32, pub gid: u32, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum TreeEntryKind { Blob, Tree, Symlink, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TreeObject { pub entries: Vec, } impl TreeObject { pub fn serialize(&self) -> Vec { bincode::serialize(self).expect("tree serialization should not fail") } pub fn deserialize(data: &[u8]) -> Result { bincode::deserialize(data) } } // Need serde impls for ObjectId impl Serialize for ObjectId { fn serialize(&self, serializer: S) -> Result { serializer.serialize_bytes(&self.0) } } impl<'de> Deserialize<'de> for ObjectId { fn deserialize>(deserializer: D) -> Result { let bytes: Vec = Deserialize::deserialize(deserializer)?; if bytes.len() != 32 { return Err(serde::de::Error::custom("expected 32 bytes for ObjectId")); } let mut arr = [0u8; 32]; arr.copy_from_slice(&bytes); Ok(ObjectId(arr)) } }