I like the goal of this idea, and I very much like the terminology around “scenarios” - however, I’m not sure lints are the correct way of evaluating this.
In particular, “scenarios” seem to me to be simply another form of dependency - specifically, dependencies on the environment, rather than on other Rust code.
The current unit of dependency management is the crate, and I think that offers an opportunity to do better than is possible with lints:
- Add a crate-level list of “scenarios” required by the crate
- Allow features (or platform-specific config) to add scenarios to the list
- Allow binary crates to define a bounding set of scenarios which dependencies cannot exceed
As an example, the core
float case could optionally “assume a float
-capable scenario”, enabled by the float
feature, which is in its default features. A kernel (which is a binary crate) would omit float
from its scenario bounding set, and thus if a dependency pulled in a float
-enabled core, it would report an error.
In the long run, this could even be made more ergonomic - rather than immediately reporting an error when a feature pulls in a disallowed scenario, continue, and build up a description of how and why the bounding set was exceeded. It’s possible that this could even extend to proposing “fixits” - such as what dependency of the top-level binary crate could be removed (or have a feature disabled) to resolve the issue.
The possible scenarios would be defined centrally, perhaps by rustc - good ones to begin with might be float(width)
, atomic(type)
, and os(name)
.