use crate::client::bridge::VirtuosoClient;
use crate::error::Result;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VirtuosoVersion {
IC23,
IC25,
Unknown,
}
impl VirtuosoVersion {
pub fn is_ic25(&self) -> bool {
false
}
}
pub fn parse_ic_version(version_str: &str) -> VirtuosoVersion {
let lower = version_str.to_lowercase();
if let Some(pos) = lower.find("ic") {
let digits: String = lower[pos + 2..]
.chars()
.take_while(|c| c.is_ascii_digit())
.collect();
if let Ok(major) = digits.parse::<u32>() {
if major >= 25 {
return VirtuosoVersion::IC25;
}
if major >= 23 {
return VirtuosoVersion::IC23;
}
return VirtuosoVersion::IC23;
}
}
VirtuosoVersion::Unknown
}
pub fn detect_version(client: &VirtuosoClient) -> Result<VirtuosoVersion> {
let result = client.execute_skill("getVersion(t)", None)?;
if result.ok() {
let version_str = result.output.trim().trim_matches('"');
if !version_str.is_empty() && version_str != "nil" {
return Ok(parse_ic_version(version_str));
}
}
let result2 = client.execute_skill("getVersionString()", None)?;
if result2.ok() {
let version_str = result2.output.trim().trim_matches('"');
if !version_str.is_empty() && version_str != "nil" {
return Ok(parse_ic_version(version_str));
}
}
Ok(VirtuosoVersion::Unknown)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ic23_1_parses_as_ic23() {
assert_eq!(parse_ic_version("IC23.1-64b.500"), VirtuosoVersion::IC23);
}
#[test]
fn ic25_1_parses_as_ic25() {
assert_eq!(parse_ic_version("IC25.1 ISR1"), VirtuosoVersion::IC25);
}
#[test]
fn ic618_parses_as_ic23() {
assert_eq!(parse_ic_version("IC6.1.8-64b.500"), VirtuosoVersion::IC23);
}
#[test]
fn ic24_parses_as_ic23() {
assert_eq!(parse_ic_version("IC24.1"), VirtuosoVersion::IC23);
}
#[test]
fn empty_string_is_unknown() {
assert_eq!(parse_ic_version(""), VirtuosoVersion::Unknown);
}
#[test]
fn garbage_is_unknown() {
assert_eq!(parse_ic_version("foo bar"), VirtuosoVersion::Unknown);
}
}