#![allow(missing_docs)]
use crate::types::{Element, Layer, UnitId};
#[derive(Debug, Clone, Copy)]
pub struct VocabTerm {
pub unit: UnitId,
pub layer: Layer,
pub element: Element,
pub term: &'static str,
}
pub fn domain_term(unit: UnitId, layer: Layer, element: Element) -> &'static str {
use Element::*;
use Layer::*;
use UnitId::*;
match (unit, layer, element) {
(FU, Data, Root) => "Root",
(FU, Data, Pointer) => "Quad",
(FU, Data, Tree) => "Tree",
(FU, Server, Root) => "Space",
(FU, Server, Pointer) => "Vector",
(FU, Server, Tree) => "Map",
(FU, Client, Root) => "Type",
(FU, Client, Pointer) => "Node",
(FU, Client, Tree) => "Relation",
(FU, Interface, Root) => "Reference",
(FU, Interface, Pointer) => "Value",
(FU, Interface, Tree) => "Set",
(MU, Data, Root) => "World",
(MU, Data, Pointer) => "Update",
(MU, Data, Tree) => "Queue",
(MU, Server, Root) => "Engine",
(MU, Server, Pointer) => "Change",
(MU, Server, Tree) => "Pool",
(MU, Client, Root) => "Flow",
(MU, Client, Pointer) => "Sequence",
(MU, Client, Tree) => "Language",
(MU, Interface, Root) => "Grammar",
(MU, Interface, Pointer) => "Expression",
(MU, Interface, Tree) => "Dictionary",
(CU, Data, Root) => "Service",
(CU, Data, Pointer) => "Operation",
(CU, Data, Tree) => "Routine",
(CU, Server, Root) => "Commitment",
(CU, Server, Pointer) => "Expectation",
(CU, Server, Tree) => "Future",
(CU, Client, Root) => "Collective",
(CU, Client, Pointer) => "Anticipation",
(CU, Client, Tree) => "Prediction",
(CU, Interface, Root) => "Condition",
(CU, Interface, Pointer) => "Suggestion",
(CU, Interface, Tree) => "Knowledge",
(OU, Data, Root) => "Session",
(OU, Data, Pointer) => "Key",
(OU, Data, Tree) => "Member",
(OU, Server, Root) => "Governance",
(OU, Server, Pointer) => "Identity",
(OU, Server, Tree) => "Group",
(OU, Client, Root) => "Hierarchy",
(OU, Client, Pointer) => "Person",
(OU, Client, Tree) => "Organisation",
(OU, Interface, Root) => "Location",
(OU, Interface, Pointer) => "Account",
(OU, Interface, Tree) => "Profile",
(SU, Data, Root) => "Scene",
(SU, Data, Pointer) => "Item",
(SU, Data, Tree) => "Perspective",
(SU, Server, Root) => "Layout",
(SU, Server, Pointer) => "View",
(SU, Server, Tree) => "Content",
(SU, Client, Root) => "Application",
(SU, Client, Pointer) => "Model",
(SU, Client, Tree) => "Collection",
(SU, Interface, Root) => "Body",
(SU, Interface, Pointer) => "Widget",
(SU, Interface, Tree) => "Specification",
(HU, Data, Root) => "Cycle",
(HU, Data, Pointer) => "Action",
(HU, Data, Tree) => "History",
(HU, Server, Root) => "Actor",
(HU, Server, Pointer) => "Event",
(HU, Server, Tree) => "Series",
(HU, Client, Root) => "Pipe",
(HU, Client, Pointer) => "Control",
(HU, Client, Tree) => "Selection",
(HU, Interface, Root) => "Stream",
(HU, Interface, Pointer) => "Input",
(HU, Interface, Tree) => "Definition",
}
}
pub fn all_terms() -> Vec<VocabTerm> {
let mut terms = Vec::with_capacity(72);
for &unit in &UnitId::ALL {
for &layer in &Layer::ALL {
for &element in &Element::ALL {
terms.push(VocabTerm {
unit,
layer,
element,
term: domain_term(unit, layer, element),
});
}
}
}
terms
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn all_72_terms_populated() {
let terms = all_terms();
assert_eq!(terms.len(), 72);
for term in &terms {
assert!(!term.term.is_empty(), "Empty term at {term:?}");
}
}
#[test]
fn all_terms_are_unique() {
let terms = all_terms();
let mut positions: Vec<(UnitId, Layer, Element)> =
terms.iter().map(|t| (t.unit, t.layer, t.element)).collect();
let orig_len = positions.len();
positions.sort();
positions.dedup();
assert_eq!(positions.len(), orig_len);
}
#[test]
fn fu_data_root_is_root() {
assert_eq!(domain_term(UnitId::FU, Layer::Data, Element::Root), "Root");
assert_eq!(
domain_term(UnitId::FU, Layer::Data, Element::Pointer),
"Quad"
);
assert_eq!(domain_term(UnitId::FU, Layer::Data, Element::Tree), "Tree");
}
#[test]
fn ou_server_pointer_is_identity() {
assert_eq!(
domain_term(UnitId::OU, Layer::Server, Element::Pointer),
"Identity"
);
}
}