use ringkernel_core::message::{CorrelationId, MessageId, Priority};
use ringkernel_derive::RingMessage;
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 100)]
pub struct FlowGenerationRequest {
#[message(id)]
pub id: MessageId,
pub batch_id: u64,
pub entry_count: u32,
pub data_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 101)]
pub struct FlowGenerationResponse {
#[message(id)]
pub id: MessageId,
#[message(correlation)]
pub correlation_id: CorrelationId,
pub batch_id: u64,
pub flow_count: u32,
pub data_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 200)]
pub struct PageRankRequest {
#[message(id)]
pub id: MessageId,
pub account_count: u32,
pub edge_count: u32,
pub damping: f32,
pub iterations: u32,
pub graph_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 201)]
pub struct PageRankResponse {
#[message(id)]
pub id: MessageId,
#[message(correlation)]
pub correlation_id: CorrelationId,
pub scores_offset: u64,
pub converged: bool,
pub iterations_run: u32,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 300)]
pub struct FraudDetectionRequest {
#[message(id)]
pub id: MessageId,
#[message(priority)]
pub priority: Priority,
pub snapshot_id: u64,
pub flow_count: u32,
pub flows_offset: u64,
pub accounts_offset: u64,
pub account_count: u32,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 301)]
pub struct FraudDetectionResponse {
#[message(id)]
pub id: MessageId,
#[message(correlation)]
pub correlation_id: CorrelationId,
pub pattern_count: u32,
pub patterns_offset: u64,
pub risk_score: f32,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 400)]
pub struct GaapValidationRequest {
#[message(id)]
pub id: MessageId,
pub flow_count: u32,
pub flows_offset: u64,
pub account_types_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 401)]
pub struct GaapValidationResponse {
#[message(id)]
pub id: MessageId,
#[message(correlation)]
pub correlation_id: CorrelationId,
pub violation_count: u32,
pub violations_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 500)]
pub struct BenfordAnalysisRequest {
#[message(id)]
pub id: MessageId,
pub amount_count: u32,
pub amounts_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 501)]
pub struct BenfordAnalysisResponse {
#[message(id)]
pub id: MessageId,
#[message(correlation)]
pub correlation_id: CorrelationId,
pub digit_counts: [u32; 9],
pub chi_squared: f32,
pub is_anomalous: bool,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 600)]
pub struct SuspenseDetectionRequest {
#[message(id)]
pub id: MessageId,
pub account_count: u32,
pub balances_offset: u64,
pub risk_scores_offset: u64,
pub flow_counts_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 601)]
pub struct SuspenseDetectionResponse {
#[message(id)]
pub id: MessageId,
#[message(correlation)]
pub correlation_id: CorrelationId,
pub suspense_count: u32,
pub scores_offset: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 900)]
pub struct AnalyticsResult {
#[message(id)]
pub id: MessageId,
pub snapshot_id: u64,
pub pagerank_complete: bool,
pub fraud_detection_complete: bool,
pub gaap_validation_complete: bool,
pub benford_complete: bool,
pub fraud_pattern_count: u32,
pub gaap_violation_count: u32,
pub suspense_account_count: u32,
pub overall_risk_score: f32,
pub benford_anomaly: bool,
pub processing_time_us: u64,
}
#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[message(type_id = 999)]
pub struct ShutdownCommand {
#[message(id)]
pub id: MessageId,
pub reason: u32, }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_message_serialization() {
let request = FlowGenerationRequest {
id: MessageId::generate(),
batch_id: 42,
entry_count: 100,
data_offset: 0x1000,
};
assert_eq!(request.batch_id, 42);
assert_eq!(request.entry_count, 100);
}
#[test]
fn test_pagerank_request() {
let request = PageRankRequest {
id: MessageId::generate(),
account_count: 50,
edge_count: 200,
damping: 0.85,
iterations: 20,
graph_offset: 0,
};
assert_eq!(request.damping, 0.85);
assert_eq!(request.iterations, 20);
}
}