use crate::algebraic_value::AlgebraicValue;
use crate::impl_deserialize;
use crate::sum_type::SumType;
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct SumValue {
pub tag: u8,
pub value: Box<AlgebraicValue>,
}
impl crate::Value for SumValue {
type Type = SumType;
}
impl SumValue {
pub fn new(tag: u8, value: impl Into<AlgebraicValue>) -> Self {
let value = Box::from(value.into());
Self { tag, value }
}
pub fn new_simple(tag: u8) -> Self {
Self::new(tag, ())
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[repr(transparent)]
pub struct SumTag(pub u8);
impl_deserialize!([] SumTag, de => <_>::deserialize(de).map(SumTag));
#[cfg(feature = "memory-usage")]
impl spacetimedb_memory_usage::MemoryUsage for SumTag {}
impl From<&u8> for &SumTag {
fn from(value: &u8) -> Self {
unsafe { core::mem::transmute(value) }
}
}
impl From<SumTag> for SumValue {
fn from(SumTag(tag): SumTag) -> Self {
SumValue::new_simple(tag)
}
}