use std::fmt;
pub const CURRENT_IR_VERSION: IrVersion = IrVersion::new(1, 0);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct IrVersion {
major: u32,
minor: u32,
}
impl IrVersion {
#[must_use]
pub const fn new(major: u32, minor: u32) -> Self {
Self { major, minor }
}
#[must_use]
pub const fn major(self) -> u32 {
self.major
}
#[must_use]
pub const fn minor(self) -> u32 {
self.minor
}
#[must_use]
pub const fn is_compatible_with(self, engine_version: IrVersion) -> bool {
self.major == engine_version.major && self.minor <= engine_version.minor
}
}
impl fmt::Display for IrVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}.{}", self.major, self.minor)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn same_version_compatible() {
let v = IrVersion::new(1, 0);
assert!(v.is_compatible_with(v));
}
#[test]
fn older_minor_compatible_with_newer_engine() {
let tree = IrVersion::new(1, 0);
let engine = IrVersion::new(1, 3);
assert!(tree.is_compatible_with(engine));
}
#[test]
fn newer_minor_incompatible_with_older_engine() {
let tree = IrVersion::new(1, 3);
let engine = IrVersion::new(1, 0);
assert!(!tree.is_compatible_with(engine));
}
#[test]
fn different_major_incompatible() {
let tree = IrVersion::new(1, 0);
let engine = IrVersion::new(2, 0);
assert!(!tree.is_compatible_with(engine));
}
#[test]
fn display() {
assert_eq!(IrVersion::new(1, 3).to_string(), "1.3");
}
}