use std::collections::BTreeMap;
use chrono::{DateTime, Utc};
use getset::Getters;
use serde::{Deserialize, Serialize};
use crate::config::DEFAULT_SOFTLINK_DEPTH;
use super::kind::EntityType;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Getters)]
#[getset(get = "pub with_prefix")]
pub struct Metadata {
entity_type: EntityType,
created_at: DateTime<Utc>,
modified_at: DateTime<Utc>,
sync_type: SyncType,
softlink_depth: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum SyncType {
#[default]
RAFT,
CRDT,
}
pub struct ExtendedAttributes<S> {
_map: BTreeMap<String, String>,
_store: S,
}
impl Metadata {
pub fn new(entity_type: EntityType) -> Self {
let now = Utc::now();
Self {
entity_type,
created_at: now,
modified_at: now,
sync_type: SyncType::default(),
softlink_depth: DEFAULT_SOFTLINK_DEPTH,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metadata_new() {
let metadata = Metadata::new(EntityType::File);
assert_eq!(*metadata.get_entity_type(), EntityType::File);
assert_eq!(*metadata.get_sync_type(), SyncType::RAFT);
assert_eq!(*metadata.get_softlink_depth(), DEFAULT_SOFTLINK_DEPTH);
}
#[test]
fn test_metadata_getters() {
let metadata = Metadata::new(EntityType::Dir);
assert_eq!(*metadata.get_entity_type(), EntityType::Dir);
assert_eq!(*metadata.get_sync_type(), SyncType::RAFT);
assert_eq!(*metadata.get_softlink_depth(), DEFAULT_SOFTLINK_DEPTH);
assert!(metadata.get_created_at() <= &Utc::now());
assert!(metadata.get_modified_at() <= &Utc::now());
}
#[test]
fn test_sync_type_default() {
assert_eq!(SyncType::default(), SyncType::RAFT);
}
#[test]
fn test_metadata_serialization() {
let metadata = Metadata::new(EntityType::File);
let serialized = serde_json::to_string(&metadata).unwrap();
let deserialized: Metadata = serde_json::from_str(&serialized).unwrap();
assert_eq!(metadata, deserialized);
}
}