use std::sync::Arc;
use assay_auth::AuthCtx;
use assay_dashboard::DashboardCtx;
#[cfg(feature = "vault")]
use assay_vault::VaultCtx;
use assay_workflow::{WorkflowCtx, WorkflowStore};
pub use assay_auth::state::AdminApiKeys;
use crate::config::EngineConfig;
#[derive(Clone)]
pub struct EngineState<S: WorkflowStore> {
pub workflow: Arc<WorkflowCtx<S>>,
pub dashboard: Arc<DashboardCtx>,
pub auth: Option<AuthCtx>,
#[cfg(feature = "vault")]
pub vault: Option<VaultCtx>,
pub admin_api_keys: Arc<Vec<String>>,
pub modules: Arc<Vec<String>>,
pub instance_id: uuid::Uuid,
pub engine_version: &'static str,
pub started_at: f64,
pub engine_config: Arc<EngineConfig>,
}
impl<S: WorkflowStore> axum::extract::FromRef<EngineState<S>> for AuthCtx {
fn from_ref(s: &EngineState<S>) -> Self {
s.auth
.clone()
.expect("auth router mounted without an AuthCtx — engine boot bug")
}
}
impl<S: WorkflowStore> axum::extract::FromRef<EngineState<S>> for AdminApiKeys {
fn from_ref(s: &EngineState<S>) -> Self {
AdminApiKeys(Arc::clone(&s.admin_api_keys))
}
}
#[cfg(feature = "vault")]
impl<S: WorkflowStore> axum::extract::FromRef<EngineState<S>> for VaultCtx {
fn from_ref(s: &EngineState<S>) -> Self {
s.vault
.clone()
.expect("vault router mounted without a VaultCtx — engine boot bug")
}
}