rscheck-cli 0.1.0-alpha.3

CLI frontend for the rscheck policy engine.
Documentation
#![cfg(test)]

use crate::analysis::Workspace;
use crate::config::{Level, Policy, RuleSettings};
use crate::emit::ReportEmitter;
use crate::report::Finding;
use crate::rules::{Rule, RuleContext};
use std::fs;

pub(crate) fn workspace_from_code(code: &str) -> Workspace {
    let dir = tempfile::tempdir().expect("tempdir");
    let file = dir.path().join("lib.rs");
    fs::write(&file, code).expect("write test source");
    let root = dir.keep();
    Workspace::new(root)
        .load_files(&Policy::default())
        .expect("load test workspace")
}

pub(crate) fn single_rule_policy(rule_id: &str, level: Level, options: toml::Table) -> Policy {
    let mut policy = Policy::default();
    policy.rules.insert(
        rule_id.to_string(),
        RuleSettings {
            level: Some(level),
            options,
        },
    );
    policy
}

pub(crate) fn run_single_file_rule(
    rule: &dyn Rule,
    rule_id: &str,
    level: Level,
    options: toml::Table,
    code: &str,
) -> Vec<Finding> {
    let workspace = workspace_from_code(code);
    let policy = single_rule_policy(rule_id, level, options);
    let mut emitter = ReportEmitter::new();
    rule.run(&workspace, &RuleContext { policy: &policy }, &mut emitter);
    emitter.findings
}