use chrono::{DateTime, Utc};
use serde_json::Value;
use uuid::Uuid;
use crate::entities::{
NewSignal, Page, Signal, SignalFilter, SignalInsert, SignalStepResolution, Step,
};
use crate::store::StoreFuture;
pub trait SignalStore: Send + Sync {
fn insert_signal(&self, signal: NewSignal) -> StoreFuture<'_, SignalInsert>;
fn list_signals(
&self,
filter: SignalFilter,
page: u32,
per_page: u32,
) -> StoreFuture<'_, Page<Signal>>;
fn list_signals_for_key(
&self,
name: &str,
key: &str,
since: DateTime<Utc>,
) -> StoreFuture<'_, Vec<Signal>>;
fn list_signal_waiters(&self, name: &str, key: &str) -> StoreFuture<'_, Vec<Step>>;
fn resolve_signal_step(
&self,
step_id: Uuid,
output: Value,
) -> StoreFuture<'_, SignalStepResolution>;
fn suspend_run_on_signal(
&self,
run_id: Uuid,
step_id: Uuid,
deadline_at: DateTime<Utc>,
) -> StoreFuture<'_, bool>;
fn purge_signals(&self, before: DateTime<Utc>) -> StoreFuture<'_, u64>;
}