#[derive(Clone, Copy)]
pub enum LintLevel {
Forbid,
Deny,
}
pub struct LintRule {
pub name: &'static str,
pub level: LintLevel,
}
#[derive(Clone, Copy)]
pub struct Preset {
pub name: &'static str,
pub description: &'static str,
pub rules: &'static [LintRule],
}
static SECURE_RULES: &[LintRule] = &[
LintRule { name: "clippy::panic", level: LintLevel::Forbid },
LintRule { name: "clippy::todo", level: LintLevel::Forbid },
LintRule { name: "clippy::unimplemented", level: LintLevel::Forbid },
LintRule { name: "clippy::exit", level: LintLevel::Forbid },
LintRule { name: "clippy::undocumented_unsafe_blocks", level: LintLevel::Forbid },
LintRule { name: "clippy::multiple_unsafe_ops_per_block", level: LintLevel::Forbid },
LintRule { name: "clippy::unwrap_used", level: LintLevel::Deny },
LintRule { name: "clippy::expect_used", level: LintLevel::Deny },
LintRule { name: "clippy::unwrap_in_result", level: LintLevel::Deny },
LintRule { name: "clippy::panic_in_result_fn", level: LintLevel::Deny },
LintRule { name: "clippy::get_unwrap", level: LintLevel::Deny },
LintRule { name: "clippy::indexing_slicing", level: LintLevel::Deny },
LintRule { name: "clippy::string_slice", level: LintLevel::Deny },
LintRule { name: "clippy::arithmetic_side_effects", level: LintLevel::Deny },
LintRule { name: "clippy::cast_possible_truncation", level: LintLevel::Deny },
LintRule { name: "clippy::cast_possible_wrap", level: LintLevel::Deny },
LintRule { name: "clippy::cast_sign_loss", level: LintLevel::Deny },
LintRule { name: "clippy::as_conversions", level: LintLevel::Deny },
LintRule { name: "clippy::as_pointer_underscore", level: LintLevel::Deny },
LintRule { name: "clippy::fallible_impl_from", level: LintLevel::Deny },
LintRule { name: "clippy::unused_result_ok", level: LintLevel::Deny },
LintRule { name: "clippy::mem_forget", level: LintLevel::Deny },
LintRule { name: "clippy::large_stack_arrays", level: LintLevel::Deny },
LintRule { name: "clippy::large_stack_frames", level: LintLevel::Deny },
LintRule { name: "clippy::std_instead_of_core", level: LintLevel::Deny },
LintRule { name: "clippy::allow_attributes_without_reason", level: LintLevel::Deny },
LintRule { name: "clippy::missing_safety_doc", level: LintLevel::Deny },
LintRule { name: "clippy::unreachable", level: LintLevel::Deny },
LintRule { name: "unsafe_op_in_unsafe_fn", level: LintLevel::Deny },
];
static SECURE_PRESET: Preset = Preset {
name: "secure",
description: "Forbids panics and unsafe shortcuts; denies fallible casts, unwraps, and unsafe patterns",
rules: SECURE_RULES,
};
static PEDANTIC_RULES: &[LintRule] = &[
LintRule { name: "clippy::panic", level: LintLevel::Forbid },
LintRule { name: "clippy::todo", level: LintLevel::Forbid },
LintRule { name: "clippy::unimplemented", level: LintLevel::Forbid },
LintRule { name: "clippy::exit", level: LintLevel::Forbid },
LintRule { name: "clippy::undocumented_unsafe_blocks", level: LintLevel::Forbid },
LintRule { name: "clippy::multiple_unsafe_ops_per_block", level: LintLevel::Forbid },
LintRule { name: "clippy::unwrap_used", level: LintLevel::Deny },
LintRule { name: "clippy::expect_used", level: LintLevel::Deny },
LintRule { name: "clippy::unwrap_in_result", level: LintLevel::Deny },
LintRule { name: "clippy::panic_in_result_fn", level: LintLevel::Deny },
LintRule { name: "clippy::get_unwrap", level: LintLevel::Deny },
LintRule { name: "clippy::indexing_slicing", level: LintLevel::Deny },
LintRule { name: "clippy::string_slice", level: LintLevel::Deny },
LintRule { name: "clippy::arithmetic_side_effects", level: LintLevel::Deny },
LintRule { name: "clippy::cast_possible_truncation", level: LintLevel::Deny },
LintRule { name: "clippy::cast_possible_wrap", level: LintLevel::Deny },
LintRule { name: "clippy::cast_sign_loss", level: LintLevel::Deny },
LintRule { name: "clippy::as_conversions", level: LintLevel::Deny },
LintRule { name: "clippy::as_pointer_underscore", level: LintLevel::Deny },
LintRule { name: "clippy::fallible_impl_from", level: LintLevel::Deny },
LintRule { name: "clippy::unused_result_ok", level: LintLevel::Deny },
LintRule { name: "clippy::mem_forget", level: LintLevel::Deny },
LintRule { name: "clippy::large_stack_arrays", level: LintLevel::Deny },
LintRule { name: "clippy::large_stack_frames", level: LintLevel::Deny },
LintRule { name: "clippy::std_instead_of_core", level: LintLevel::Deny },
LintRule { name: "clippy::allow_attributes_without_reason", level: LintLevel::Deny },
LintRule { name: "clippy::missing_safety_doc", level: LintLevel::Deny },
LintRule { name: "clippy::unreachable", level: LintLevel::Deny },
LintRule { name: "unsafe_op_in_unsafe_fn", level: LintLevel::Deny },
LintRule { name: "clippy::pedantic", level: LintLevel::Deny },
LintRule { name: "clippy::dbg_macro", level: LintLevel::Deny },
LintRule { name: "clippy::print_stdout", level: LintLevel::Deny },
LintRule { name: "clippy::print_stderr", level: LintLevel::Deny },
LintRule { name: "clippy::shadow_reuse", level: LintLevel::Deny },
LintRule { name: "clippy::shadow_unrelated", level: LintLevel::Deny },
LintRule { name: "clippy::missing_assert_message", level: LintLevel::Deny },
LintRule { name: "clippy::default_numeric_fallback", level: LintLevel::Deny },
LintRule { name: "clippy::integer_division", level: LintLevel::Deny },
LintRule { name: "clippy::float_arithmetic", level: LintLevel::Deny },
];
static PEDANTIC_PRESET: Preset = Preset {
name: "pedantic",
description: "Everything in 'secure', plus clippy::pedantic and additional strictness lints",
rules: PEDANTIC_RULES,
};
pub static PRESETS: &[&Preset] = &[&SECURE_PRESET, &PEDANTIC_PRESET];