use core::fmt;
use cometbft::Version;
use crate::prelude::*;
use crate::Error;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum CompatMode {
V0_34,
V0_37,
}
impl Default for CompatMode {
fn default() -> Self {
CompatMode::latest()
}
}
impl CompatMode {
pub const fn latest() -> Self {
Self::V0_37
}
pub fn from_version(cometbft_version: Version) -> Result<CompatMode, Error> {
let raw_version: String = cometbft_version.into();
let version = semver::Version::parse(raw_version.trim_start_matches('v'))
.map_err(|_| Error::invalid_cometbft_version(raw_version))?;
match (version.major, version.minor) {
(1, _) => Ok(CompatMode::V0_37),
(0, 34) => Ok(CompatMode::V0_34),
(0, 37) => Ok(CompatMode::V0_37),
(0, 38) => Ok(CompatMode::V0_37),
_ => Err(Error::unsupported_cometbft_version(version.to_string())),
}
}
}
impl fmt::Display for CompatMode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CompatMode::V0_34 => f.write_str("v0.34"),
CompatMode::V0_37 => f.write_str("v0.37"),
}
}
}
#[cfg(test)]
mod tests {
use super::CompatMode;
use crate::prelude::*;
use cometbft::Version;
fn parse_version(s: &str) -> Version {
let json = format!("\"{s}\"");
serde_json::from_str(&json).unwrap()
}
#[test]
fn test_parse_version_for_compat_mode() {
assert_eq!(
CompatMode::from_version(parse_version("v0.34.16")).unwrap(),
CompatMode::V0_34
);
assert_eq!(
CompatMode::from_version(parse_version("v0.37.0-pre1")).unwrap(),
CompatMode::V0_37
);
assert_eq!(
CompatMode::from_version(parse_version("v0.37.0")).unwrap(),
CompatMode::V0_37
);
assert_eq!(
CompatMode::from_version(parse_version("v0.38.0")).unwrap(),
CompatMode::V0_37
);
let res = CompatMode::from_version(parse_version("v0.39.0"));
assert!(res.is_err());
assert_eq!(
CompatMode::from_version(parse_version("v1.0.0-alpha.1")).unwrap(),
CompatMode::V0_37
);
assert_eq!(
CompatMode::from_version(parse_version("v1.0.0")).unwrap(),
CompatMode::V0_37
);
assert_eq!(
CompatMode::from_version(parse_version("v1.1.0")).unwrap(),
CompatMode::V0_37
);
let res = CompatMode::from_version(parse_version("poobah"));
assert!(res.is_err());
}
}