use std::time::{Duration, SystemTime};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Message {
Snapshot(Snapshot),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Snapshot {
pub seq: u64,
pub captured_at: SystemTime,
pub uptime: Duration,
pub actors: Vec<ActorSnapshot>,
pub totals: Totals,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct ActorId(pub u64);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActorSnapshot {
pub id: ActorId,
pub name: String,
pub status: ActorStatus,
pub handling: Option<HandlerActivity>,
pub waiting_on: Option<WaitEdge>,
pub strategy: Option<SupervisorStrategy>,
pub spawned_at: SystemTime,
pub mailbox: MailboxStats,
pub counters: ActorCounters,
pub message_types: Vec<MessageCount>,
pub refs: RefCounts,
pub links: Links,
pub supervision: Option<SupervisionInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageCount {
pub name: String,
pub count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SupervisionInfo {
pub policy: RestartPolicy,
pub max_restarts: u32,
pub restart_window: Duration,
pub restart_count: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RestartPolicy {
Permanent,
Transient,
Never,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SupervisorStrategy {
OneForOne,
OneForAll,
RestForOne,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HandlerActivity {
pub message: String,
pub elapsed: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WaitEdge {
pub target: ActorId,
pub kind: WaitKind,
pub elapsed: Duration,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WaitKind {
Ask,
Tell,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ActorStatus {
Starting,
Running,
Restarting,
Stopping,
Stopped {
at: SystemTime,
reason: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MailboxStats {
pub kind: MailboxKind,
pub len: usize,
pub capacity: Option<usize>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MailboxKind {
Bounded,
Unbounded,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ActorCounters {
pub messages_received: u64,
pub lifecycle_signals_received: u64,
pub link_died_signals_received: u64,
pub panics: u64,
pub restarts: u64,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct RefCounts {
pub strong: usize,
pub weak: usize,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Links {
pub parent: Option<ActorId>,
pub children: Vec<ActorId>,
pub siblings: Vec<ActorId>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Totals {
pub alive: usize,
pub total_spawned: u64,
pub total_stopped: u64,
pub messages_received: u64,
}