use yog_ids::{fact, host_mirror, key_space, mirror_word, word};
use crate::cell::Kind;
use crate::spec::{FieldSpec, MirrorSpec};
pub struct HostField {
pub name: &'static str,
pub fact: &'static str,
pub kind: Kind,
pub count: u32,
}
pub struct HostMirror {
pub address: &'static str,
pub space: &'static str,
pub fields: &'static [HostField],
}
const XYZ: u32 = 3;
const YAW_PITCH: u32 = 2;
const UUID_HALVES: u32 = 2;
const fn field(name: &'static str, fact: &'static str, kind: Kind, count: u32) -> HostField {
HostField {
name,
fact,
kind,
count,
}
}
pub const ENTITY: HostMirror = HostMirror {
address: host_mirror::ENTITY,
space: key_space::ENTITY,
fields: &[
field(mirror_word::POS, fact::ENTITY_POS, Kind::F64, XYZ),
field(mirror_word::VELOCITY, fact::ENTITY_VELOCITY, Kind::F64, XYZ),
field(
yog_ids::model::ROTATION,
fact::ENTITY_ROTATION,
Kind::F32,
YAW_PITCH,
),
field(word::KIND, fact::ENTITY_KIND, Kind::U32, 1),
field(word::DIMENSION, fact::ENTITY_DIMENSION, Kind::U32, 1),
field(mirror_word::HEALTH, fact::ENTITY_HEALTH, Kind::F32, 1),
field(mirror_word::UUID, fact::ENTITY_UUID, Kind::U64, UUID_HALVES),
],
};
pub const PLAYER: HostMirror = HostMirror {
address: host_mirror::PLAYER,
space: key_space::PLAYER,
fields: &[field(word::NAME, fact::PLAYER_NAME, Kind::U32, 1)],
};
pub const BLOCK: HostMirror = HostMirror {
address: host_mirror::BLOCK,
space: key_space::BLOCK,
fields: &[field(word::STATE, fact::BLOCK_STATE, Kind::U32, 1)],
};
pub const ALL: &[&HostMirror] = &[&ENTITY, &PLAYER, &BLOCK];
pub const FAMILIES: &[&str] = &[key_space::BLOCK];
impl HostMirror {
pub fn spec(&self) -> MirrorSpec {
MirrorSpec {
name: self.address.to_owned(),
space: self.space.to_owned(),
fields: self.fields().collect(),
}
}
pub fn fields(&self) -> impl Iterator<Item = FieldSpec> + '_ {
self.fields.iter().map(|f| FieldSpec {
name: f.name.to_owned(),
fact: Some(f.fact.to_owned()),
kind: f.kind.code(),
count: f.count,
})
}
pub const fn shaped(&self, i: usize, kind: Kind, count: u32) -> bool {
i < self.fields.len()
&& self.fields[i].kind.code() == kind.code()
&& self.fields[i].count == count
}
}