mirror of
https://github.com/eyre-rs/eyre.git
synced 2025-09-27 13:01:29 +00:00

RFC 2145 is in beta now, deprecating the public_in_private lint. https://rust-lang.github.io/rfcs/2145-type-privacy.html public_in_private has been superceded by three new lints. The first two are warn-by-default and the third is allow-by-default. See the excerpt below for some details. This change skips this lint in nightly and beta in favor of the new warn-by-default lints. This change revealed a bug in the toolchain config option for color-spantrace -- it doesn't exist! The lint it was guarding was never turned on. This adds a minimal build script to check for toolchain to color-spantrace. Its functionality is tested in the eyre crate, which seems sufficient to me. After this change there are only two more build warnings for eyre and color-spantrace, the future-incompat dependency warning and the more serious filename collision. <quote> Lint private_interfaces is reported when a type with visibility x is used in primary interface of an item with effective visibility y and x < y. This lint is warn-by-default. Lint private_bounds is reported when a type or trait with visibility x is used in secondary interface of an item with effective visibility y and x < y. This lint is warn-by-default. Lint unnameable_types is reported when effective visibility of a type is larger than module in which it can be named, either directly, or through reexports, or through trivial type aliases (type X = Y;, no generics on both sides). This lint is allow-by-default. Compatibility lint private_in_public is never reported and removed. </quote>
54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
use std::env;
|
|
use std::ffi::OsString;
|
|
use std::process::Command;
|
|
use std::str;
|
|
|
|
fn main() {
|
|
let version = match rustc_version_info() {
|
|
Some(version) => version,
|
|
None => return,
|
|
};
|
|
version.toolchain.set_feature();
|
|
}
|
|
|
|
#[derive(PartialEq)]
|
|
enum Toolchain {
|
|
Stable,
|
|
Beta,
|
|
Nightly,
|
|
}
|
|
|
|
impl Toolchain {
|
|
fn set_feature(self) {
|
|
match self {
|
|
Toolchain::Nightly => println!("cargo:rustc-cfg=nightly"),
|
|
Toolchain::Beta => println!("cargo:rustc-cfg=beta"),
|
|
Toolchain::Stable => println!("cargo:rustc-cfg=stable"),
|
|
}
|
|
}
|
|
}
|
|
|
|
struct VersionInfo {
|
|
toolchain: Toolchain,
|
|
}
|
|
|
|
fn rustc_version_info() -> Option<VersionInfo> {
|
|
let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
|
|
let output = Command::new(rustc).arg("--version").output().ok()?;
|
|
let version = str::from_utf8(&output.stdout).ok()?;
|
|
let mut pieces = version.split(['.', ' ', '-']);
|
|
if pieces.next() != Some("rustc") {
|
|
return None;
|
|
}
|
|
let _major: u32 = pieces.next()?.parse().ok()?;
|
|
let _minor: u32 = pieces.next()?.parse().ok()?;
|
|
let _patch: u32 = pieces.next()?.parse().ok()?;
|
|
let toolchain = match pieces.next() {
|
|
Some("beta") => Toolchain::Beta,
|
|
Some("nightly") => Toolchain::Nightly,
|
|
_ => Toolchain::Stable,
|
|
};
|
|
let version = VersionInfo { toolchain };
|
|
Some(version)
|
|
}
|