- 
                Notifications
    You must be signed in to change notification settings 
- Fork 1.8k
Description
What it does
The lint allows users to forbid using certain types via certain trait interfaces, for instance:
clippy.toml:
disallowed-trait-usage = [
   { type = "std::fs::PathBuf", trait = "std::fmt::Debug", reason = "Use path.display() instead" },
]Advantage
My use case: forbidding using Debug formatting of certain types.
I am in constant pursuit of improving error messages across the crate eco-system. An easy (and common) mistake is to use Debug formatting {:?} when Display formatting {} would be better, e.g. in log calls and error message formatting. This also applies to GUIs. Usually, if there is a Display implementation, that's what should be used in any user-facing code (arguable everywhere outside of dbg!).
So I'd like to be able to use Clippy to find all these cases, and I think a good way of accomplishing it is to say "I forbid datatype X to be used via the std::fmt::Debug trait".
An example of where I've manually searched for Debug formatting and replacing it with Display (and surely missing many places):
Example
clippy.toml:
disallowed-trait-usage = [
   { type = "std::fs::PathBuf", trait = "std::fmt::Debug", reason = "Use path.display() instead" },
]anyhow::bail!("No such file: {path:?}");
// Or:
fn print(x: &dyn Debug) { … }
print(&my_path);->
clippy::disallowed-trait-usage: Not allowed to use `std::fs::PathBuf` as trait `std::fmt::Debug`. Reason: "Use path.display() instead"
Comparison with existing lints
There is not existing lint to cover this, but there is a similar suggestion here:
The difference is that disallowed-trait-usage would forbid all trait methods on a type. I suspect this is actually easier to implement in clippy.