use std::{fmt::Display, str::FromStr};
use crate::error::ParseVersionError;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub struct Version {
major: usize,
minor: usize,
}
impl Version {
pub const V1_0: Version = Version { major: 1, minor: 0 };
pub fn new(major: usize, minor: usize) -> Version {
Version { major, minor }
}
pub const fn latest() -> Version {
Version::V1_0
}
pub fn major(&self) -> usize {
self.major
}
pub fn minor(&self) -> usize {
self.minor
}
}
#[test]
fn version_ordering() {
assert!(Version { major: 1, minor: 0 } < Version { major: 1, minor: 1 });
assert!(Version { major: 2, minor: 0 } > Version { major: 1, minor: 0 });
}
impl Default for Version {
fn default() -> Self {
Self::V1_0
}
}
impl Display for Version {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}.{}", self.major, self.minor)
}
}
impl FromStr for Version {
type Err = ParseVersionError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let (major_part, minor_part) = s.split_once(".").ok_or(ParseVersionError::MissingDot)?;
let major: usize = major_part.parse::<usize>()?;
let minor: usize = minor_part.parse::<usize>()?;
Ok(Self { major, minor })
}
}
#[test]
fn correct_version_from_str() {
assert_eq!(Version::from_str("1.0").unwrap(), Version::new(1, 0));
assert_eq!(Version::from_str("2.0").unwrap(), Version::new(2, 0));
assert_eq!(Version::from_str("2.20").unwrap(), Version::new(2, 20));
}
#[test]
fn incorrect_version_from_str() {
assert!(matches!(
Version::from_str("1"),
Err(ParseVersionError::MissingDot)
));
match Version::from_str("1.1.1") {
Err(ParseVersionError::ParseInt(_)) => {}
Ok(_) => panic!("'1.1.1' should not be a valid version"),
Err(_) => panic!("'1.1.1' should raise ParseIntError"),
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Message<B = Box<[u8]>> {
GetInfo,
SetTck { period_ns: u32 },
Shift {
num_bits: u32,
tms: B,
tdi: B,
},
}
pub type OwnedMessage = Message<Box<[u8]>>;
pub type BorrowedMessage<'a> = Message<&'a [u8]>;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct XvcInfo {
version: Version,
max_vector_len: u32,
}
impl XvcInfo {
pub fn new(version: Version, max_vector_len: u32) -> XvcInfo {
XvcInfo {
version,
max_vector_len,
}
}
pub fn version(&self) -> Version {
self.version
}
pub fn max_vector_len(&self) -> u32 {
self.max_vector_len
}
}
impl Default for XvcInfo {
fn default() -> XvcInfo {
XvcInfo {
version: Version::default(),
max_vector_len: 10 * 1024 * 1024, }
}
}
#[derive(Eq, PartialEq, Clone, Debug)]
pub enum XvcCommand {
GetInfo,
SetTck,
Shift,
}