leash 0.1.0

Shareable Clippy lint presets for teams and orgs
#[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];