#[derive(Debug, Clone, Default)]
pub struct NodeStats {
pub visits: u32,
pub successes: u32,
pub failures: u32,
pub discoveries: u32,
}
impl NodeStats {
pub fn new() -> Self {
Self::default()
}
pub fn record_success(&mut self) {
self.visits += 1;
self.successes += 1;
}
pub fn record_failure(&mut self) {
self.visits += 1;
self.failures += 1;
}
pub fn record_discovery(&mut self, count: u32) {
self.visits += 1;
self.successes += 1;
self.discoveries += count;
}
pub fn success_rate(&self) -> f64 {
if self.visits == 0 {
0.5 } else {
self.successes as f64 / self.visits as f64
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_node_stats_success_rate() {
let mut stats = NodeStats::new();
assert_eq!(stats.success_rate(), 0.5);
stats.record_success();
stats.record_success();
stats.record_failure();
assert!((stats.success_rate() - 0.666).abs() < 0.01);
}
}