Skip to main content

rumdl_lib/code_block_tools/
run_state.rs

1//! Invocation-scoped accounting, shared by files and tool phases.
2
3use std::collections::BTreeMap;
4use std::sync::Mutex;
5use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
6
7#[derive(Debug, Default)]
8pub struct RunState {
9    executions: AtomicUsize,
10    aborted: AtomicBool,
11    cached_checks: AtomicUsize,
12    warnings: Mutex<BTreeMap<String, String>>,
13    pub(super) versions: super::versions::VersionState,
14}
15
16// Operational state is excluded from configuration serialization and identity.
17impl PartialEq for RunState {
18    fn eq(&self, _other: &Self) -> bool {
19        true
20    }
21}
22impl Eq for RunState {}
23
24impl RunState {
25    pub fn abort(&self) {
26        self.aborted.store(true, Ordering::Relaxed);
27    }
28    pub fn aborted(&self) -> bool {
29        self.aborted.load(Ordering::Relaxed)
30    }
31    pub fn record_execution(&self) {
32        self.executions.fetch_add(1, Ordering::Relaxed);
33    }
34    pub fn record_cached_check(&self) {
35        self.cached_checks.fetch_add(1, Ordering::Relaxed);
36    }
37    pub fn checked_anything(&self) -> bool {
38        self.executions.load(Ordering::Relaxed) > 0 || self.cached_checks.load(Ordering::Relaxed) > 0
39    }
40    pub fn warn(&self, key: String, message: String) {
41        self.warnings
42            .lock()
43            .unwrap_or_else(std::sync::PoisonError::into_inner)
44            .entry(key)
45            .or_insert(message);
46    }
47    pub fn warnings(&self) -> Vec<String> {
48        self.warnings
49            .lock()
50            .unwrap_or_else(std::sync::PoisonError::into_inner)
51            .values()
52            .cloned()
53            .collect()
54    }
55}