oatf 0.4.0

Rust SDK for the Open Agent Threat Format (OATF)
Documentation
use oatf::enums::AdvanceReason;
use oatf::primitives::evaluate_trigger;
use oatf::types::{ProtocolEvent, Trigger, TriggerResult, TriggerState};
use serde_json::json;
use std::time::Duration;

#[test]
fn evaluate_trigger_clamps_negative_count_to_one() {
    let trigger = Trigger {
        event: Some("tools/call".to_string()),
        count: Some(-5),
        match_predicate: None,
        after: None,
    };
    let event = ProtocolEvent {
        event_type: "tools/call".to_string(),
        content: json!({}),
    };
    let mut state = TriggerState::default();

    let result = evaluate_trigger(&trigger, Some(&event), Duration::from_secs(0), &mut state);

    match result {
        TriggerResult::Advanced { reason } => assert_eq!(reason, AdvanceReason::EventMatched),
        TriggerResult::NotAdvanced => panic!("negative count should be clamped to 1"),
    }
    assert_eq!(state.event_count, 1);
}

#[test]
fn evaluate_trigger_clamps_zero_count_to_one() {
    let trigger = Trigger {
        event: Some("tools/call".to_string()),
        count: Some(0),
        match_predicate: None,
        after: None,
    };
    let event = ProtocolEvent {
        event_type: "tools/call".to_string(),
        content: json!({}),
    };
    let mut state = TriggerState::default();

    let result = evaluate_trigger(&trigger, Some(&event), Duration::from_secs(0), &mut state);

    match result {
        TriggerResult::Advanced { reason } => assert_eq!(reason, AdvanceReason::EventMatched),
        TriggerResult::NotAdvanced => panic!("zero count should be clamped to 1"),
    }
    assert_eq!(state.event_count, 1);
}