use std::collections::HashMap;
use bson::{Binary, DateTime, Document};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct IndexInfo {
key: Document,
#[serde(serialize_with = "crate::bson::serde_helpers::serialize_u32_as_i32")]
pub root_pid: u32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CollectionSpecificationInfo {
pub uuid: Option<Binary>,
pub create_at: DateTime,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CollectionSpecification {
#[serde(rename = "_id")]
pub _id: String,
#[serde(rename = "type")]
pub collection_type: CollectionType,
pub info: CollectionSpecificationInfo,
pub indexes: HashMap<String, IndexInfo>,
}
impl CollectionSpecification {
#[inline]
pub fn name(&self) -> &str {
self._id.as_str()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum CollectionType {
View,
Collection,
}
#[cfg(test)]
mod test {
use std::collections::HashMap;
use bson::{Binary, DateTime};
use bson::spec::BinarySubtype;
use crate::collection_info::{CollectionSpecification, CollectionSpecificationInfo, CollectionType};
#[test]
fn test_serial() {
let u = uuid::Uuid::new_v4();
let spec = CollectionSpecification {
_id: "test".to_string(),
collection_type: CollectionType::Collection,
info: CollectionSpecificationInfo {
uuid: Some(Binary {
subtype: BinarySubtype::Uuid,
bytes: u.as_bytes().to_vec(),
}),
create_at: DateTime::now(),
},
indexes: HashMap::new(),
};
let doc = bson::to_document(&spec).unwrap();
assert_eq!(doc.get("_id").unwrap().as_str().unwrap(), "test");
let bytes = bson::to_vec(&doc).unwrap();
assert_eq!(bytes.len(), 110);
}
}