codetether-rlm 0.1.0

Recursive Language Model processing for CodeTether
Documentation
use std::collections::HashSet;

use super::TreeSitterVerification;

pub(crate) fn compare_names(
    claimed: Vec<String>,
    actual: Vec<String>,
    label: &str,
) -> TreeSitterVerification {
    if claimed.is_empty() {
        return TreeSitterVerification::CannotVerify {
            reason: format!("Could not extract {label} names from answer"),
        };
    }

    let claimed_set: HashSet<_> = claimed.iter().cloned().collect();
    let actual_set: HashSet<_> = actual.iter().cloned().collect();
    if claimed_set == actual_set {
        TreeSitterVerification::ExactMatch
    } else if claimed_set.is_subset(&actual_set) {
        TreeSitterVerification::SubsetMatch {
            claimed: claimed.len(),
            actual: actual.len(),
        }
    } else {
        TreeSitterVerification::HasErrors {
            errors: unexpected_errors(&claimed, &actual_set, label),
        }
    }
}

fn unexpected_errors(claimed: &[String], actual: &HashSet<String>, label: &str) -> Vec<String> {
    claimed
        .iter()
        .filter(|name| !actual.contains(*name))
        .map(|name| format!("{label} '{name}' not found"))
        .collect()
}