use tiny_counter::{EventId, EventStore};
#[derive(Debug, Clone, Copy)]
enum ResourceEvent {
ConnectionOpen,
ConnectionClose,
TaskStart,
TaskComplete,
}
impl AsRef<str> for ResourceEvent {
fn as_ref(&self) -> &str {
match self {
ResourceEvent::ConnectionOpen => "resource:connection:open",
ResourceEvent::ConnectionClose => "resource:connection:close",
ResourceEvent::TaskStart => "resource:task:start",
ResourceEvent::TaskComplete => "resource:task:complete",
}
}
}
impl EventId for ResourceEvent {}
fn main() {
println!("=== Resource Tracking Examples ===\n");
println!("1. Connection pool tracking:");
let store = EventStore::new();
store.record_count(ResourceEvent::ConnectionOpen, 5);
println!(" Opened 5 connections");
store.record_count(ResourceEvent::ConnectionClose, 2);
println!(" Closed 2 connections");
let open_connections = store
.query_delta(
ResourceEvent::ConnectionOpen,
ResourceEvent::ConnectionClose,
)
.ever()
.sum();
println!(" Current open connections: {}\n", open_connections.max(0));
println!("2. Enforcing capacity limits:");
let store = EventStore::new();
for i in 1..=12 {
let current = store
.query_delta(
ResourceEvent::ConnectionOpen,
ResourceEvent::ConnectionClose,
)
.ever()
.sum()
.max(0);
if current < 10 {
store.record(ResourceEvent::ConnectionOpen);
println!(
" Connection {}: ✓ Opened (capacity: {}/10)",
i,
current + 1
);
} else {
println!(" Connection {}: ✗ Pool exhausted (10/10)", i);
}
}
println!("\n3. Task tracking:");
let store = EventStore::new();
store.record_count(ResourceEvent::TaskStart, 8);
println!(" Started 8 tasks");
store.record_count(ResourceEvent::TaskComplete, 5);
println!(" Completed 5 tasks");
let running_tasks = store
.query_delta(ResourceEvent::TaskStart, ResourceEvent::TaskComplete)
.ever()
.sum()
.max(0);
println!(" Currently running: {} tasks", running_tasks);
let total_started = store
.query(ResourceEvent::TaskStart)
.ever()
.sum()
.unwrap_or(0);
let total_completed = store
.query(ResourceEvent::TaskComplete)
.ever()
.sum()
.unwrap_or(0);
println!(
" Historical: {} started, {} completed\n",
total_started, total_completed
);
println!("4. Resource usage over time:");
let store = EventStore::new();
for _ in 0..20 {
store.record(ResourceEvent::ConnectionOpen);
}
for _ in 0..15 {
store.record(ResourceEvent::ConnectionClose);
}
println!(" Simulated connection activity");
let last_hour = store
.query_delta(
ResourceEvent::ConnectionOpen,
ResourceEvent::ConnectionClose,
)
.last_hours(1)
.sum()
.max(0);
let last_day = store
.query_delta(
ResourceEvent::ConnectionOpen,
ResourceEvent::ConnectionClose,
)
.last_days(1)
.sum()
.max(0);
let all_time = store
.query_delta(
ResourceEvent::ConnectionOpen,
ResourceEvent::ConnectionClose,
)
.ever()
.sum()
.max(0);
println!(" Net change last hour: {}", last_hour);
println!(" Net change last day: {}", last_day);
println!(" Net change all time: {}\n", all_time);
println!("5. Balancing operations:");
let store = EventStore::new();
store.record_count(ResourceEvent::TaskStart, 100);
store.record_count(ResourceEvent::TaskComplete, 30);
let before = store
.query_delta(ResourceEvent::TaskStart, ResourceEvent::TaskComplete)
.ever()
.sum();
println!(" Started 100 tasks, completed 30");
println!(" Delta before balance: {}", before);
store
.balance_delta(ResourceEvent::TaskStart, ResourceEvent::TaskComplete)
.unwrap();
let after = store
.query_delta(ResourceEvent::TaskStart, ResourceEvent::TaskComplete)
.ever()
.sum();
println!(" After balancing: {}", after);
println!(" (Added {} completions to balance)\n", before);
println!("6. Capacity monitoring:");
let store = EventStore::new();
for i in 1..=8 {
store.record(ResourceEvent::ConnectionOpen);
let current = store
.query_delta(
ResourceEvent::ConnectionOpen,
ResourceEvent::ConnectionClose,
)
.ever()
.sum()
.max(0);
let capacity = 10;
let utilization = (current as f64 / capacity as f64) * 100.0;
print!(
" Connection {}: {} open ({:.0}% utilization)",
i, current, utilization
);
if utilization >= 80.0 {
print!(" ⚠️ High utilization!");
}
println!();
}
println!("\n✓ Resource tracking complete!");
}