use std::future::Future;
use std::pin::Pin;
use uuid::Uuid;
use crate::entities::{
NewRun, NewStep, NewStepDependency, Page, Run, RunFilter, RunStats, RunStatus, RunUpdate, Step,
StepDependency, StepUpdate,
};
use crate::error::StoreError;
pub type StoreFuture<'a, T> = Pin<Box<dyn Future<Output = Result<T, StoreError>> + Send + 'a>>;
pub trait RunStore: Send + Sync {
fn create_run(&self, req: NewRun) -> StoreFuture<'_, Run>;
fn get_run(&self, id: Uuid) -> StoreFuture<'_, Option<Run>>;
fn list_runs(&self, filter: RunFilter, page: u32, per_page: u32) -> StoreFuture<'_, Page<Run>>;
fn update_run_status(&self, id: Uuid, new_status: RunStatus) -> StoreFuture<'_, ()>;
fn update_run(&self, id: Uuid, update: RunUpdate) -> StoreFuture<'_, ()>;
fn pick_next_pending(&self) -> StoreFuture<'_, Option<Run>>;
fn create_step(&self, step: NewStep) -> StoreFuture<'_, Step>;
fn update_step(&self, id: Uuid, update: StepUpdate) -> StoreFuture<'_, ()>;
fn list_steps(&self, run_id: Uuid) -> StoreFuture<'_, Vec<Step>>;
fn get_stats(&self) -> StoreFuture<'_, RunStats>;
fn create_step_dependencies(&self, deps: Vec<NewStepDependency>) -> StoreFuture<'_, ()>;
fn list_step_dependencies(&self, run_id: Uuid) -> StoreFuture<'_, Vec<StepDependency>>;
fn update_run_returning(&self, id: Uuid, update: RunUpdate) -> StoreFuture<'_, Run> {
Box::pin(async move {
self.update_run(id, update).await?;
self.get_run(id).await?.ok_or(StoreError::RunNotFound(id))
})
}
}