use crate::{BaseVersion, FullVersion, Version};
pub use error::{NumericError, ParserError};
pub mod error;
pub mod modular;
pub mod original;
pub trait VersionParser {
fn parse_version<B: AsRef<[u8]>>(&self, input: B) -> Result<Version, ParserError>;
}
pub trait BaseVersionParser {
fn parse_base<B: AsRef<[u8]>>(&self, input: B) -> Result<BaseVersion, ParserError>;
}
pub trait FullVersionParser {
fn parse_full<B: AsRef<[u8]>>(&self, input: B) -> Result<FullVersion, ParserError>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_version_either() {
let input = "1.22.33";
let expected = Version::new_full_version(1, 22, 33);
let original = original::OriginalParser;
let v = original.parse_version(input).unwrap();
assert_eq!(v, expected);
let modular = modular::ModularParser;
let v = modular.parse_version(input).unwrap();
assert_eq!(v, expected);
}
fn example_generic<T: VersionParser>(input: &str, p: T) -> Version {
p.parse_version(input).unwrap()
}
#[test]
fn parse_version_either_generic() {
let input = "1.22.33";
let expected = Version::new_full_version(1, 22, 33);
let v = example_generic(input, original::OriginalParser);
assert_eq!(v, expected);
let v = example_generic(input, modular::ModularParser);
assert_eq!(v, expected);
}
}