1use crate::client::bridge::VirtuosoClient;
2use crate::error::Result;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub enum VirtuosoVersion {
15 IC23,
17 IC25,
19 Unknown,
21}
22
23impl VirtuosoVersion {
24 pub fn is_ic25(&self) -> bool {
28 false
31 }
32}
33
34pub fn parse_ic_version(version_str: &str) -> VirtuosoVersion {
36 let lower = version_str.to_lowercase();
38 if let Some(pos) = lower.find("ic") {
39 let digits: String = lower[pos + 2..]
40 .chars()
41 .take_while(|c| c.is_ascii_digit())
42 .collect();
43 if let Ok(major) = digits.parse::<u32>() {
44 if major >= 25 {
45 return VirtuosoVersion::IC25;
46 }
47 if major >= 23 {
48 return VirtuosoVersion::IC23;
49 }
50 return VirtuosoVersion::IC23;
52 }
53 }
54 VirtuosoVersion::Unknown
55}
56
57pub fn detect_version(client: &VirtuosoClient) -> Result<VirtuosoVersion> {
60 let result = client.execute_skill("getVersion(t)", None)?;
62 if result.ok() {
63 let version_str = result.output.trim().trim_matches('"');
64 if !version_str.is_empty() && version_str != "nil" {
65 return Ok(parse_ic_version(version_str));
66 }
67 }
68 let result2 = client.execute_skill("getVersionString()", None)?;
70 if result2.ok() {
71 let version_str = result2.output.trim().trim_matches('"');
72 if !version_str.is_empty() && version_str != "nil" {
73 return Ok(parse_ic_version(version_str));
74 }
75 }
76 Ok(VirtuosoVersion::Unknown)
77}
78
79#[cfg(test)]
80mod tests {
81 use super::*;
82
83 #[test]
84 fn ic23_1_parses_as_ic23() {
85 assert_eq!(parse_ic_version("IC23.1-64b.500"), VirtuosoVersion::IC23);
86 }
87
88 #[test]
89 fn ic25_1_parses_as_ic25() {
90 assert_eq!(parse_ic_version("IC25.1 ISR1"), VirtuosoVersion::IC25);
91 }
92
93 #[test]
94 fn ic618_parses_as_ic23() {
95 assert_eq!(parse_ic_version("IC6.1.8-64b.500"), VirtuosoVersion::IC23);
96 }
97
98 #[test]
99 fn ic24_parses_as_ic23() {
100 assert_eq!(parse_ic_version("IC24.1"), VirtuosoVersion::IC23);
101 }
102
103 #[test]
104 fn empty_string_is_unknown() {
105 assert_eq!(parse_ic_version(""), VirtuosoVersion::Unknown);
106 }
107
108 #[test]
109 fn garbage_is_unknown() {
110 assert_eq!(parse_ic_version("foo bar"), VirtuosoVersion::Unknown);
111 }
112}