summaryrefslogtreecommitdiffstats
path: root/src/modules/rust.rs
diff options
context:
space:
mode:
authorDario Vladović <d.vladimyr@gmail.com>2021-04-10 19:06:25 +0200
committerGitHub <noreply@github.com>2021-04-10 19:06:25 +0200
commitfe030c2064e20f1359ab4844d3b3472a1ed1f6b6 (patch)
tree076eed69af43236b5000e05b685ad16b8ca89514 /src/modules/rust.rs
parent436eb61efd57a9e76131fc293486ef562e2b1f79 (diff)
refactor: propagate version formatting errors (#2566)
* refactor: propagate version formatting errors * refactor: trim version formatting boilerplate * refactor(node): unwrap version formatting * docs: fix typo * docs: remove dots after `version_format` * feat: lazy version parsing * refactor(version-formatter): collect segments into string
Diffstat (limited to 'src/modules/rust.rs')
-rw-r--r--src/modules/rust.rs69
1 files changed, 35 insertions, 34 deletions
diff --git a/src/modules/rust.rs b/src/modules/rust.rs
index 963522a9c..a465d9798 100644
--- a/src/modules/rust.rs
+++ b/src/modules/rust.rs
@@ -72,27 +72,25 @@ fn get_module_version(context: &Context, config: &RustConfig) -> Option<String>
// - `rustup show`
// - `rustup show active-toolchain`
// - `rustup which`
- let module_version = if let Some(toolchain) = env_rustup_toolchain(context)
+ if let Some(toolchain) = env_rustup_toolchain(context)
.or_else(|| execute_rustup_override_list(&context.current_dir))
.or_else(|| find_rust_toolchain_file(&context))
{
match execute_rustup_run_rustc_version(&toolchain) {
- RustupRunRustcVersionOutcome::RustcVersion(stdout) => {
- format_rustc_version(config, stdout)
+ RustupRunRustcVersionOutcome::RustcVersion(rustc_version) => {
+ format_rustc_version(&rustc_version, config.version_format)
}
- RustupRunRustcVersionOutcome::ToolchainName(toolchain) => toolchain,
+ RustupRunRustcVersionOutcome::ToolchainName(toolchain) => Some(toolchain),
RustupRunRustcVersionOutcome::RustupNotWorking => {
// If `rustup` is not in `$PATH` or cannot be executed for other reasons, we can
// safely execute `rustc --version`.
- format_rustc_version(config, execute_rustc_version()?)
+ format_rustc_version(&execute_rustc_version()?, config.version_format)
}
- RustupRunRustcVersionOutcome::Err => return None,
+ RustupRunRustcVersionOutcome::Err => None,
}
} else {
- format_rustc_version(config, execute_rustc_version()?)
- };
-
- Some(module_version)
+ format_rustc_version(&execute_rustc_version()?, config.version_format)
+ }
}
fn env_rustup_toolchain(context: &Context) -> Option<String> {
@@ -205,14 +203,19 @@ fn execute_rustc_version() -> Option<String> {
}
}
-fn format_rustc_version(config: &RustConfig, mut rustc_stdout: String) -> String {
- let offset = &rustc_stdout.find('(').unwrap_or_else(|| rustc_stdout.len());
- let formatted_version: String = rustc_stdout.drain(..offset).collect();
- let full_version_string = formatted_version.replace("rustc", "");
- let version_string = full_version_string.trim();
- match VersionFormatter::new(config.version_format) {
- Ok(formatter) => formatter.format_version(&version_string),
- _ => format!("v{}", version_string),
+fn format_rustc_version(rustc_version: &str, version_format: &str) -> Option<String> {
+ let version = rustc_version
+ // split into ["rustc", "1.34.0", ...]
+ .split_whitespace()
+ // get down to "1.34.0"
+ .nth(1)?;
+
+ match VersionFormatter::format_version(version, version_format) {
+ Ok(formatted) => Some(formatted),
+ Err(error) => {
+ log::warn!("Error formating `rust` version:\n{}", error);
+ Some(format!("v{}", version))
+ }
}
}
@@ -326,27 +329,25 @@ mod tests {
#[test]
fn test_format_rustc_version() {
- let test_config: RustConfig = RustConfig::default();
-
- let nightly_input = String::from("rustc 1.34.0-nightly (b139669f3 2019-04-10)");
+ let config = RustConfig::default();
+ let rustc_stable = "rustc 1.34.0 (91856ed52 2019-04-10)";
+ let rustc_beta = "rustc 1.34.0-beta.1 (2bc1d406d 2019-04-10)";
+ let rustc_nightly = "rustc 1.34.0-nightly (b139669f3 2019-04-10)";
assert_eq!(
- format_rustc_version(&test_config, nightly_input),
- "v1.34.0-nightly"
+ format_rustc_version(rustc_nightly, config.version_format),
+ Some("v1.34.0-nightly".to_string())
);
-
- let beta_input = String::from("rustc 1.34.0-beta.1 (2bc1d406d 2019-04-10)");
assert_eq!(
- format_rustc_version(&test_config, beta_input),
- "v1.34.0-beta.1"
+ format_rustc_version(rustc_beta, config.version_format),
+ Some("v1.34.0-beta.1".to_string())
+ );
+ assert_eq!(
+ format_rustc_version(rustc_stable, config.version_format),
+ Some("v1.34.0".to_string())
);
-
- let stable_input = String::from("rustc 1.34.0 (91856ed52 2019-04-10)");
- assert_eq!(format_rustc_version(&test_config, stable_input), "v1.34.0");
-
- let version_without_hash = String::from("rustc 1.34.0");
assert_eq!(
- format_rustc_version(&test_config, version_without_hash),
- "v1.34.0"
+ format_rustc_version("rustc 1.34.0", config.version_format),
+ Some("v1.34.0".to_string())
);
}