use std::fmt;
use version_compare::{CompOp, VersionCompare};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Version {
#[cfg(feature = "send2")]
V2,
#[cfg(feature = "send3")]
V3,
}
impl Version {
pub fn parse<'a>(ver: &'a str) -> Result<Self, &'a str> {
let mut stripped = ver.trim();
if stripped.starts_with('v') {
stripped = &stripped[1..];
}
if stripped.is_empty() {
return Err(ver);
}
#[cfg(feature = "send2")]
{
let lower =
VersionCompare::compare_to(stripped, "2.0", &CompOp::Ge).map_err(|_| ver)?;
let upper =
VersionCompare::compare_to(stripped, "3.0", &CompOp::Lt).map_err(|_| ver)?;
if lower && upper {
return Ok(Version::V2);
}
}
#[cfg(feature = "send3")]
{
let lower =
VersionCompare::compare_to(stripped, "3.0", &CompOp::Ge).map_err(|_| ver)?;
let upper =
VersionCompare::compare_to(stripped, "4.0", &CompOp::Lt).map_err(|_| ver)?;
if lower && upper {
return Ok(Version::V3);
}
}
Err(ver)
}
}
impl fmt::Display for Version {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
#[cfg(feature = "send2")]
Version::V2 => write!(f, "2"),
#[cfg(feature = "send3")]
Version::V3 => write!(f, "3"),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum DesiredVersion {
Use(Version),
Assume(Version),
Lookup,
}
impl DesiredVersion {
pub fn version(self) -> Option<Version> {
match self {
DesiredVersion::Use(v) => Some(v),
DesiredVersion::Assume(v) => Some(v),
DesiredVersion::Lookup => None,
}
}
}