#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum XptVersion {
#[default]
V5,
V8,
}
impl XptVersion {
#[must_use]
pub const fn is_v5(&self) -> bool {
matches!(self, Self::V5)
}
#[must_use]
pub const fn is_v8(&self) -> bool {
matches!(self, Self::V8)
}
#[must_use]
pub const fn max_variable_name_len(&self) -> usize {
match self {
Self::V5 => 8,
Self::V8 => 32,
}
}
#[must_use]
pub const fn max_label_len(&self) -> usize {
match self {
Self::V5 => 40,
Self::V8 => 256,
}
}
#[must_use]
pub const fn is_implemented(&self) -> bool {
matches!(self, Self::V5)
}
}
impl std::fmt::Display for XptVersion {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::V5 => write!(f, "v5"),
Self::V8 => write!(f, "v8"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_version_properties() {
assert!(XptVersion::V5.is_v5());
assert!(!XptVersion::V5.is_v8());
assert!(XptVersion::V5.is_implemented());
assert!(!XptVersion::V8.is_v5());
assert!(XptVersion::V8.is_v8());
assert!(!XptVersion::V8.is_implemented());
}
#[test]
fn test_version_limits() {
assert_eq!(XptVersion::V5.max_variable_name_len(), 8);
assert_eq!(XptVersion::V5.max_label_len(), 40);
assert_eq!(XptVersion::V8.max_variable_name_len(), 32);
assert_eq!(XptVersion::V8.max_label_len(), 256);
}
}