use spacetimedb_sats::{ProductType, ProductTypeElement, SumType, SumTypeVariant};
#[derive(PartialEq, Eq, PartialOrd, Ord)]
pub enum ElementLabel<'a> {
Unnamed(usize),
Named(&'a str),
}
impl<'a> From<(usize, &'a ProductTypeElement)> for ElementLabel<'a> {
fn from((i, element): (usize, &'a ProductTypeElement)) -> Self {
match &element.name {
Some(name) => ElementLabel::Named(&name[..]),
None => ElementLabel::Unnamed(i),
}
}
}
impl<'a> From<(usize, &'a SumTypeVariant)> for ElementLabel<'a> {
fn from((i, element): (usize, &'a SumTypeVariant)) -> Self {
match &element.name {
Some(name) => ElementLabel::Named(&name[..]),
None => ElementLabel::Unnamed(i),
}
}
}
pub fn sum_type_has_default_ordering(ty: &SumType) -> bool {
ty.variants.iter().enumerate().map(ElementLabel::from).is_sorted()
}
pub fn product_type_has_default_ordering(ty: &ProductType) -> bool {
ty.elements.iter().enumerate().map(ElementLabel::from).is_sorted()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_element_label_comparison() {
let a = ElementLabel::Unnamed(0);
let b = ElementLabel::Unnamed(2);
let c = ElementLabel::Named("apples");
let d = ElementLabel::Named("oranges");
let e = ElementLabel::Named("oranges_tomorrow");
assert!(a == a);
assert!(a < b);
assert!(a < c);
assert!(a < d);
assert!(a < e);
assert!(b > a);
assert!(b == b);
assert!(b < c);
assert!(b < d);
assert!(b < e);
assert!(c > a);
assert!(c > b);
assert!(c == c);
assert!(c < d);
assert!(c < e);
assert!(d > a);
assert!(d > b);
assert!(d > c);
assert!(d == d);
assert!(d < e);
assert!(e > a);
assert!(e > b);
assert!(e > c);
assert!(e > d);
assert!(e == e);
}
}