pub mod id;
pub mod set;
pub mod storage;
pub use set::FrameMerkleSet;
pub use storage::FrameStorage;
use crate::error::StorageError;
use crate::metadata::frame_types::FrameMetadata;
use crate::types::{FrameID, NodeID};
use std::path::Path;
pub fn open_storage(path: &Path) -> Result<FrameStorage, StorageError> {
storage::FrameStorage::new(path)
}
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Basis {
Node(NodeID),
Frame(FrameID),
Both { node: NodeID, frame: FrameID },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Frame {
pub frame_id: FrameID,
pub basis: Basis,
#[serde(default)]
pub agent_id: String,
pub content: Vec<u8>, pub frame_type: String, pub metadata: FrameMetadata, pub timestamp: std::time::SystemTime,
}
impl Frame {
pub fn new(
basis: Basis,
content: Vec<u8>,
frame_type: String,
agent_id: String,
metadata: impl Into<FrameMetadata>,
) -> Result<Self, crate::error::StorageError> {
let mut metadata: FrameMetadata = metadata.into();
metadata.insert("agent_id".to_string(), agent_id.clone());
let frame_id = id::compute_frame_id(&basis, &content, &frame_type, &agent_id)?;
Ok(Frame {
frame_id,
basis,
agent_id,
content,
frame_type,
metadata,
timestamp: std::time::SystemTime::now(),
})
}
pub fn text_content(&self) -> Result<String, std::string::FromUtf8Error> {
String::from_utf8(self.content.clone())
}
pub fn json_content<T>(&self) -> Result<T, serde_json::Error>
where
T: serde::de::DeserializeOwned,
{
serde_json::from_slice(&self.content)
}
pub fn agent_id(&self) -> Option<&str> {
Some(self.agent_id.as_str())
}
pub fn metadata_value(&self, key: &str) -> Option<&str> {
self.metadata.get(key).map(|s| s.as_str())
}
pub fn is_deleted(&self) -> bool {
self.metadata_value("deleted") == Some("true")
}
pub fn is_type(&self, frame_type: &str) -> bool {
self.frame_type == frame_type
}
}