use std::time::{Duration, SystemTime};
pub mod registry;
pub use registry::{NoopSwapBackend, RuleRegistry, RuleSwapBackend, SignatureVerifier};
#[derive(Debug, Clone)]
pub struct CompiledRule {
pub rule_id: String,
pub version: u64,
pub ptx: Vec<u8>,
pub compute_cap: String,
pub depends_on: Vec<String>,
pub signature: Option<Vec<u8>>,
pub actor_config: ActorConfig,
pub metadata: RuleMetadata,
}
#[derive(Debug, Clone)]
pub struct ActorConfig {
pub block_dim: (u32, u32, u32),
pub grid_dim: (u32, u32, u32),
pub shared_mem_bytes: u32,
pub max_in_flight: u32,
}
impl Default for ActorConfig {
fn default() -> Self {
Self {
block_dim: (1, 1, 1),
grid_dim: (1, 1, 1),
shared_mem_bytes: 0,
max_in_flight: 1024,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct RuleMetadata {
pub source_language: Option<String>,
pub source_hash: Option<[u8; 32]>,
pub compiled_at: Option<SystemTime>,
pub compiler_version: Option<String>,
pub author: Option<String>,
}
#[derive(Debug, Clone)]
pub struct RuleHandle {
pub rule_id: String,
pub version: u64,
pub status: RuleStatus,
pub registered_at: SystemTime,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RuleStatus {
Registered,
Active,
Quiescing,
Superseded(u64),
Rolledback,
Failed,
}
#[derive(Debug, Clone)]
pub struct ReloadReport {
pub rule_id: String,
pub from_version: u64,
pub to_version: u64,
pub quiesce_duration: Duration,
pub swap_duration: Duration,
pub messages_in_flight_during_swap: u64,
pub rollback_available: bool,
}
#[derive(Debug, thiserror::Error)]
pub enum RuleError {
#[error("rule not found: {0}")]
NotFound(String),
#[error("version downgrade rejected: current={current}, proposed={proposed}")]
VersionDowngrade {
current: u64,
proposed: u64,
},
#[error("compute capability mismatch: rule={required}, device={available}")]
ComputeCapMismatch {
required: String,
available: String,
},
#[error("dependency missing: {0}")]
MissingDependency(String),
#[error("signature verification failed")]
InvalidSignature,
#[error("rollback target not in history: version={0}")]
RollbackTargetMissing(u64),
#[error("no active version to rollback")]
NoActiveVersion,
#[error("quiesce timeout after {0:?}")]
QuiesceTimeout(Duration),
#[error("swap backend error: {0}")]
BackendError(String),
#[error("duplicate version: rule={rule_id}, version={version}")]
DuplicateVersion {
rule_id: String,
version: u64,
},
}