use crate::chunk::ChunkHash;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FileId(pub Uuid);
impl FileId {
pub fn new() -> Self {
Self(Uuid::new_v4())
}
pub fn from_uuid(uuid: Uuid) -> Self {
Self(uuid)
}
}
impl Default for FileId {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Display for FileId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileMetadata {
pub id: FileId,
pub name: String,
pub mime_type: Option<String>,
pub size: u64,
pub created_at: i64,
pub modified_at: i64,
pub content_hash: ChunkHash,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileManifest {
pub metadata: FileMetadata,
pub chunks: Vec<ChunkHash>,
pub encrypted_dek: Option<Vec<u8>>,
pub salt: Option<Vec<u8>>,
pub version: u64,
}
impl FileManifest {
pub fn new(metadata: FileMetadata, chunks: Vec<ChunkHash>) -> Self {
Self {
metadata,
chunks,
encrypted_dek: None,
salt: None,
version: 1,
}
}
pub fn chunk_count(&self) -> usize {
self.chunks.len()
}
}