firedbg_rust_debugger/
version.rs

1/// Get the `rustc` version *in the system*.
2pub fn rustc_version() -> String {
3    let rustc = std::env::var("RUSTC").unwrap_or_else(|_| "rustc".to_string());
4    let output = std::process::Command::new(rustc)
5        .arg("--version")
6        .output()
7        .unwrap();
8    let stdout = std::str::from_utf8(&output.stdout).unwrap();
9    parse_rustc_version(stdout)
10}
11
12fn parse_rustc_version(line: &str) -> String {
13    let full_version = line.split_whitespace().nth(1).expect("full version");
14    let mut version_parts: Vec<_> = full_version.split('.').rev().collect();
15    assert!(version_parts.len() > 2);
16    let major = version_parts.pop().expect("major version");
17    let minor = version_parts.pop().expect("minor version");
18    format!("{major}.{minor}")
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24
25    #[test]
26    fn test_parse_rustc_version() {
27        assert_eq!(
28            parse_rustc_version("rustc 1.73.0 (cc66ad468 2023-10-03)"),
29            "1.73"
30        );
31        assert_eq!(
32            parse_rustc_version("rustc 1.72.1 (xxxxxxxxx 2023-09-19)"),
33            "1.72"
34        );
35        assert_eq!(
36            parse_rustc_version("rustc 1.72.0 (xxxxxxxxx 2023-08-24)"),
37            "1.72"
38        );
39        assert_eq!(
40            parse_rustc_version("rustc 1.71.1 (xxxxxxxxx 2023-08-03)"),
41            "1.71"
42        );
43        assert_eq!(
44            parse_rustc_version("rustc 1.71.0 (xxxxxxxxx 2023-07-13)"),
45            "1.71"
46        );
47        assert_eq!(
48            parse_rustc_version("rustc 1.70.0 (xxxxxxxxx 2023-06-01)"),
49            "1.70"
50        );
51    }
52}