mod internal;
use anyhow::Result;
use rusqlite::Connection;
#[derive(Debug, Clone)]
pub struct VerificationQuery {
pub query_type: String, pub label: String,
pub expect: String, pub query_text: String, }
#[derive(Debug)]
pub struct VerificationResult {
pub label: String,
pub query_type: String,
pub query_text: String,
pub expectation: String,
pub status: VerificationStatus,
pub result: Option<String>,
pub error: Option<String>,
}
#[derive(Debug, PartialEq)]
pub enum VerificationStatus {
Pass,
Contested,
Error,
}
impl VerificationStatus {
pub fn as_str(&self) -> &'static str {
match self {
VerificationStatus::Pass => "pass",
VerificationStatus::Contested => "contested",
VerificationStatus::Error => "error",
}
}
}
#[derive(Debug, Default)]
pub struct VerificationAggregates {
pub total: i32,
pub passed: i32,
pub failed: i32,
pub errored: i32,
}
pub fn parse_verification_blocks(content: &str) -> Vec<VerificationQuery> {
internal::parse::parse_verification_blocks(content)
}
pub fn run_verification_queries(
conn: &Connection,
belief_id: &str,
queries: &[VerificationQuery],
data_freshness: &str,
) -> (Vec<VerificationResult>, VerificationAggregates) {
let mut results = Vec::new();
let mut aggregates = VerificationAggregates::default();
for query in queries {
let result = internal::exec::execute_verification_query(conn, query);
aggregates.total += 1;
match result.status {
VerificationStatus::Pass => aggregates.passed += 1,
VerificationStatus::Contested => aggregates.failed += 1,
VerificationStatus::Error => aggregates.errored += 1,
}
results.push(result);
}
if let Err(e) =
internal::exec::store_verification_results(conn, belief_id, &results, data_freshness)
{
eprintln!(
" Warning: failed to store verification results for {}: {}",
belief_id, e
);
}
(results, aggregates)
}
pub fn create_tables(conn: &Connection) -> Result<()> {
internal::exec::create_tables(conn)
}