oneiros-model 0.0.7

Shared domain types for oneiros
Documentation
use serde::{Deserialize, Serialize};

use crate::*;

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(untagged)]
pub enum ImportEvent {
    Valid {
        id: EventId,
        source: Source,
        timestamp: String,
        data: serde_json::Value,
    },
    Unsourced {
        id: EventId,
        timestamp: String,
        data: serde_json::Value,
    },
}

impl ImportEvent {
    pub fn with_source(self, source: Source) -> Self {
        match self {
            ImportEvent::Unsourced {
                id,
                timestamp,
                data,
            } => ImportEvent::Valid {
                id,
                source,
                timestamp,
                data,
            },
            valid @ ImportEvent::Valid { .. } => valid,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ImportResponse {
    pub imported: usize,
    pub replayed: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ReplayResponse {
    pub replayed: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct SelectEventById {
    pub id: EventId,
}

// ── Request types ──────────────────────────────────────────────────

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ImportEventsRequest {
    pub events: Vec<ImportEvent>,
}

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ReplayEventsRequest;

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ListEventsRequest {
    #[serde(default)]
    pub after: Option<u64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct GetEventRequest {
    pub id: EventId,
}

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ExportEventsRequest;

// ── Protocol enums ─────────────────────────────────────────────────

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(rename_all = "kebab-case", tag = "type", content = "data")]
pub enum EventRequests {
    ImportEvents(ImportEventsRequest),
    ReplayEvents(ReplayEventsRequest),
    ListEvents(ListEventsRequest),
    GetEvent(GetEventRequest),
    ExportEvents(ExportEventsRequest),
}

#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(rename_all = "kebab-case", tag = "type", content = "data")]
pub enum EventResponses {
    Imported(ImportResponse),
    Replayed(ReplayResponse),
    Listed(Vec<Event>),
    Found(Event),
    Exported(Vec<Event>),
}