use bincode::{Decode, Encode};
use serde::{Deserialize, Serialize};
use super::address::{Address, RevisionId, SpaceId};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Encode, Decode)]
pub struct BlockId(pub u64);
#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
pub struct Record {
pub address: Address,
pub revision: RevisionId,
pub data: Vec<u8>,
pub tombstone: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
pub struct Block {
pub id: BlockId,
pub space: SpaceId,
pub records: Vec<Record>,
pub min_revision: RevisionId,
pub max_revision: RevisionId,
pub checksum: [u8; 32],
}
impl Block {
pub fn has_live_records_at(&self, rev: RevisionId) -> bool {
self.records
.iter()
.any(|r| r.revision <= rev && !r.tombstone)
}
pub fn get_at(&self, address: &Address, rev: RevisionId) -> Option<&Record> {
self.records
.iter()
.filter(|r| &r.address == address && r.revision <= rev)
.max_by_key(|r| r.revision)
.filter(|r| !r.tombstone)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Relation {
pub name: String,
pub space: SpaceId,
}