use bevy::prelude::*;
use super::types::{
AggregationType, MetricDefinition, MetricId, MetricReport, MetricSnapshot, MetricValue,
};
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct DefineMetricRequested {
pub definition: MetricDefinition,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct RecordMetricRequested {
pub value: MetricValue,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct CreateSnapshotRequested {
pub timestamp: u64,
pub label: Option<String>,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct GenerateReportRequested {
pub period_start: u64,
pub period_end: u64,
pub metric_ids: Vec<MetricId>,
pub aggregations: Vec<AggregationType>,
pub label: Option<String>,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct RemoveMetricRequested {
pub metric_id: MetricId,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct ClearMetricsRequested;
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct MetricDefined {
pub definition: MetricDefinition,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct MetricRecorded {
pub value: MetricValue,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct SnapshotCreated {
pub snapshot: MetricSnapshot,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct ReportGenerated {
pub report: MetricReport,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct MetricRemoved {
pub metric_id: MetricId,
}
#[derive(Message, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct MetricsCleared {
pub timestamp: u64,
}
#[derive(Event, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct MetricRecordedEvent {
pub value: MetricValue,
}
#[derive(Event, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct SnapshotCreatedEvent {
pub snapshot: MetricSnapshot,
}
#[derive(Event, Clone, Debug, Reflect)]
#[reflect(opaque)]
pub struct ReportGeneratedEvent {
pub report: MetricReport,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::plugins::metrics::types::MetricType;
#[test]
fn test_define_metric_requested() {
let definition =
MetricDefinition::new(MetricId::new("fps"), MetricType::Gauge, "Frames per second");
let message = DefineMetricRequested { definition };
assert_eq!(message.definition.metric_id, MetricId::new("fps"));
}
#[test]
fn test_record_metric_requested() {
let value = MetricValue::new(MetricId::new("fps"), 60.0, 1000);
let message = RecordMetricRequested { value };
assert_eq!(message.value.metric_id, MetricId::new("fps"));
assert_eq!(message.value.value, 60.0);
}
#[test]
fn test_create_snapshot_requested() {
let message = CreateSnapshotRequested {
timestamp: 1000,
label: Some("test_snapshot".to_string()),
};
assert_eq!(message.timestamp, 1000);
assert_eq!(message.label, Some("test_snapshot".to_string()));
}
#[test]
fn test_generate_report_requested() {
let message = GenerateReportRequested {
period_start: 1000,
period_end: 2000,
metric_ids: vec![MetricId::new("fps")],
aggregations: vec![AggregationType::Average, AggregationType::P95],
label: Some("weekly_report".to_string()),
};
assert_eq!(message.period_start, 1000);
assert_eq!(message.period_end, 2000);
assert_eq!(message.metric_ids.len(), 1);
assert_eq!(message.aggregations.len(), 2);
}
}