sil-policy 0.1.0

Policy evaluation engine for the Semantic Integrity Layer — risk scoring and Allow/Warn/Block/Rewrite decisions
Documentation
use crate::decision::Decision;
use crate::rules::{RiskInput, evaluate_risk};

pub fn evaluate(input: RiskInput, original: &str) -> Decision {
    let score = evaluate_risk(input);

    if score > 0.8 {
        return Decision::Block;
    }

    if score > 0.5 {
        return Decision::Warn;
    }

    if contains_repairable_issue(original) {
        return Decision::Rewrite(sanitize(original));
    }

    Decision::Allow
}

fn contains_repairable_issue(input: &str) -> bool {
    input.contains('\u{200B}') || input.contains("ƒ")
}

fn sanitize(input: &str) -> String {
    input.replace('ƒ', "f")
}