mod events;
mod tasks;
mod timers;
pub use events::{BufferedEvent, EventStore, TargetedDelivery};
pub use tasks::{ClaimError, TaskStore};
pub use timers::TimerStore;
use std::fmt::Debug;
use async_trait::async_trait;
use serde_json::Value;
use crate::core::{
Case, CaseId, CaseStatus, CaseVersion, CorrelationKey, Deadline, DeadlineState, Digest, RunId,
StoreError, Timestamp,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Correlation {
Opened(CaseId),
Attached(CaseId),
}
impl Correlation {
#[must_use]
pub fn case_id(self) -> CaseId {
match self {
Self::Opened(id) | Self::Attached(id) => id,
}
}
#[must_use]
pub fn is_new(self) -> bool {
matches!(self, Self::Opened(_))
}
}
#[async_trait]
pub trait CaseStore: Send + Sync + Debug {
async fn correlate(&self, keys: &[CorrelationKey]) -> Result<Option<CaseId>, StoreError>;
async fn correlate_or_open(
&self,
kind: &str,
keys: &[CorrelationKey],
at: Timestamp,
) -> Result<Correlation, StoreError>;
async fn case(&self, id: CaseId) -> Result<Option<Case>, StoreError>;
async fn attach_run(&self, case: CaseId, run: RunId) -> Result<(), StoreError>;
async fn link_blob(
&self,
case: CaseId,
digest: Digest,
at: Timestamp,
) -> Result<(), StoreError>;
async fn blobs_of(&self, case: CaseId) -> Result<Vec<Digest>, StoreError>;
async fn put_state(
&self,
case: CaseId,
expected: CaseVersion,
state: Value,
) -> Result<CaseVersion, StoreError>;
async fn set_status(&self, case: CaseId, status: CaseStatus) -> Result<(), StoreError>;
async fn close(&self, case: CaseId) -> Result<(), StoreError>;
async fn register_deadline(&self, deadline: &Deadline) -> Result<(), StoreError>;
async fn deadlines(&self, case: CaseId) -> Result<Vec<Deadline>, StoreError>;
async fn set_deadline_state(
&self,
case: CaseId,
name: &str,
state: DeadlineState,
) -> Result<(), StoreError>;
async fn due(&self, now: Timestamp, limit: usize) -> Result<Vec<Deadline>, StoreError>;
async fn by_status(&self, status: CaseStatus, limit: usize) -> Result<Vec<Case>, StoreError>;
async fn census(&self, now: Timestamp) -> Result<CaseCensus, StoreError>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct CaseCensus {
pub open: u64,
pub oldest_age_secs: Option<u64>,
pub due: u64,
}