dictator-rust 0.25.1

Rust language decree for Dictator structural linter
Documentation
use crate::lint_source;

#[test]
fn detects_pub_after_private_in_struct() {
    let src = r"
struct User {
    name: String,
    age: u32,
    pub email: String,
}
";
    let diags = lint_source(src);
    assert!(
        diags.iter().any(|d| d.rule == "rust/visibility-order"),
        "Should detect pub field after private fields in struct"
    );
}

#[test]
fn detects_pub_after_private_in_impl() {
    let src = r"
impl User {
    fn private_method(&self) {}
    pub fn public_method(&self) {}
}
";
    let diags = lint_source(src);
    assert!(
        diags.iter().any(|d| d.rule == "rust/visibility-order"),
        "Should detect pub method after private method in impl"
    );
}

#[test]
fn accepts_pub_before_private() {
    let src = r"
struct User {
    pub id: u32,
    pub name: String,
    email: String,
}
";
    let diags = lint_source(src);
    assert!(
        !diags.iter().any(|d| d.rule == "rust/visibility-order"),
        "Should accept public fields before private fields"
    );
}

#[test]
fn accepts_impl_with_correct_order() {
    let src = r"
impl User {
    pub fn new(name: String) -> Self {
        User { name }
    }

    pub fn get_name(&self) -> &str {
        &self.name
    }

    fn validate(&self) -> bool {
        true
    }
}
";
    let diags = lint_source(src);
    assert!(
        !diags.iter().any(|d| d.rule == "rust/visibility-order"),
        "Should accept impl with public methods before private"
    );
}