Skip to main content

alien_core/events/
handler.rs

1use crate::events::{AlienEvent, EventState};
2use crate::Result;
3use async_trait::async_trait;
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6#[cfg(feature = "openapi")]
7use utoipa::ToSchema;
8
9/// Represents a change to an event
10#[derive(Debug, Clone, Serialize, Deserialize)]
11#[cfg_attr(feature = "openapi", derive(ToSchema))]
12#[serde(tag = "type", rename_all = "camelCase")]
13pub enum EventChange {
14    /// A new event was created
15    #[serde(rename_all = "camelCase")]
16    Created {
17        /// Unique identifier for the event
18        id: String,
19        /// Parent event ID if this is a child event
20        parent_id: Option<String>,
21        /// Timestamp when the event was created
22        created_at: DateTime<Utc>,
23        /// The actual event data
24        event: AlienEvent,
25        /// Initial state of the event
26        state: EventState,
27    },
28
29    /// An existing event was updated
30    #[serde(rename_all = "camelCase")]
31    Updated {
32        /// Unique identifier for the event
33        id: String,
34        /// Timestamp when the event was updated
35        updated_at: DateTime<Utc>,
36        /// The new event data
37        event: AlienEvent,
38    },
39
40    /// An event's state changed
41    #[serde(rename_all = "camelCase")]
42    StateChanged {
43        /// Unique identifier for the event
44        id: String,
45        /// Timestamp when the state changed
46        updated_at: DateTime<Utc>,
47        /// The new state
48        new_state: EventState,
49    },
50}
51
52/// Trait for handling events
53#[async_trait]
54pub trait EventHandler: Send + Sync {
55    /// Called when any event change occurs
56    async fn on_event_change(&self, change: EventChange) -> Result<()>;
57}
58
59/// A no-op event handler for testing
60pub struct NoOpEventHandler;
61
62#[async_trait]
63impl EventHandler for NoOpEventHandler {
64    async fn on_event_change(&self, _change: EventChange) -> Result<()> {
65        Ok(())
66    }
67}