clnrm_core/coverage/
tracker.rs1use crate::coverage::BehaviorCoverage;
4use std::sync::Arc;
5use tokio::sync::RwLock;
6
7#[derive(Debug, Clone)]
9pub struct CoverageTracker {
10 coverage: Arc<RwLock<BehaviorCoverage>>,
11}
12
13impl CoverageTracker {
14 pub fn new() -> Self {
16 Self {
17 coverage: Arc::new(RwLock::new(BehaviorCoverage::new())),
18 }
19 }
20
21 pub async fn snapshot(&self) -> BehaviorCoverage {
23 self.coverage.read().await.clone()
24 }
25
26 pub async fn record_api(&self, endpoint: String) {
28 self.coverage.write().await.record_api_endpoint(endpoint);
29 }
30
31 pub async fn record_transition(&self, entity: String, from: Option<String>, to: String) {
33 use crate::coverage::StateTransition;
34 let transition = StateTransition::new(entity, from, to);
35 self.coverage
36 .write()
37 .await
38 .record_state_transition(transition);
39 }
40
41 pub async fn record_error(&self, scenario: String) {
43 self.coverage.write().await.record_error_scenario(scenario);
44 }
45
46 pub async fn record_flow(&self, flow: String) {
48 self.coverage.write().await.record_data_flow(flow);
49 }
50
51 pub async fn record_integration(&self, service: String, operation: String) {
53 self.coverage
54 .write()
55 .await
56 .record_integration(service, operation);
57 }
58
59 pub async fn record_span(&self, span_name: String) {
61 self.coverage.write().await.record_span(span_name);
62 }
63
64 pub async fn merge(&self, other: &CoverageTracker) {
66 let other_coverage = other.snapshot().await;
67 self.coverage.write().await.merge(&other_coverage);
68 }
69
70 pub async fn reset(&self) {
72 *self.coverage.write().await = BehaviorCoverage::new();
73 }
74}
75
76impl Default for CoverageTracker {
77 fn default() -> Self {
78 Self::new()
79 }
80}