use yog_data::Schema;
use crate::cell::Kind;
#[derive(Schema, Clone, Debug, PartialEq, Eq)]
pub struct FieldSpec {
pub name: String,
pub fact: Option<String>,
pub kind: u8,
pub count: u32,
}
impl FieldSpec {
pub fn kind(&self) -> Option<Kind> {
Kind::from_code(self.kind)
}
pub fn width(&self) -> Option<u32> {
Some(self.kind()?.size() as u32 * self.count)
}
}
#[derive(Schema, Clone, Debug, PartialEq, Eq)]
pub struct MirrorSpec {
pub name: String,
pub space: String,
pub fields: Vec<FieldSpec>,
}
#[derive(Schema, Copy, Clone, Debug, PartialEq, Eq)]
pub enum Rate {
Every(u32),
Changes,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Linked {
pub column: *const yog_abi::YogColumn,
pub depth: u8,
}
#[derive(Clone, Debug)]
pub struct Declared {
pub id: u32,
pub space: *const yog_abi::YogKeySpace,
pub rows: *const yog_abi::YogColumn,
pub fields: Vec<Option<Linked>>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Due {
pub writer: u32,
pub mirror: yog_sync::Arc<str>,
pub fields: u64,
pub space: u64,
pub space_name: yog_sync::Arc<str>,
pub rows: u64,
pub columns: std::ops::Range<usize>,
pub scopes: std::ops::Range<usize>,
}
#[derive(Clone, Debug, Default)]
pub struct DueList {
pub turns: Vec<Due>,
columns: Vec<u64>,
scopes: Vec<yog_sync::Arc<[u8]>>,
}
impl DueList {
pub fn columns(&self, due: &Due) -> &[u64] {
&self.columns[due.columns.clone()]
}
pub fn scopes(&self, due: &Due) -> &[yog_sync::Arc<[u8]>] {
&self.scopes[due.scopes.clone()]
}
pub(crate) fn clear(&mut self) {
self.turns.clear();
self.columns.clear();
self.scopes.clear();
}
pub(crate) fn push_scope(&mut self, scope: yog_sync::Arc<[u8]>) {
self.scopes.push(scope);
}
pub(crate) fn next_scope(&self) -> usize {
self.scopes.len()
}
pub(crate) fn push_column(&mut self, column: u64) {
self.columns.push(column);
}
pub(crate) fn next_column(&self) -> usize {
self.columns.len()
}
}