use std::sync::Arc;
use chronon_core::{ChrononError, Result};
use chronon_executor::ScriptRegistry;
use chronon_runtime::CoordinatorService;
use serde_json::Value as JsonValue;
use crate::auth::{require_admin_auth_from_env, AdminAuth};
pub type HttpUpsertActorProvider = Arc<dyn Fn() -> JsonValue + Send + Sync>;
#[derive(Clone)]
pub struct ChrononState {
pub coordinator: Arc<CoordinatorService>,
pub registry: Arc<ScriptRegistry>,
pub admin_auth: Option<Arc<dyn AdminAuth>>,
pub require_admin_auth: bool,
pub http_upsert_actor: Option<HttpUpsertActorProvider>,
}
impl ChrononState {
#[must_use]
pub fn new(coordinator: Arc<CoordinatorService>, registry: Arc<ScriptRegistry>) -> Self {
Self {
coordinator,
registry,
admin_auth: None,
require_admin_auth: require_admin_auth_from_env(),
http_upsert_actor: None,
}
}
#[must_use]
pub fn builder(
coordinator: Arc<CoordinatorService>,
registry: Arc<ScriptRegistry>,
) -> ChrononStateBuilder {
ChrononStateBuilder {
coordinator,
registry,
admin_auth: None,
require_admin_auth: require_admin_auth_from_env(),
http_upsert_actor: None,
}
}
#[must_use]
pub fn default_upsert_actor_json(&self) -> JsonValue {
if let Some(ref provider) = self.http_upsert_actor {
return provider();
}
chronon_core::default_http_enqueue_actor()
}
}
pub struct ChrononStateBuilder {
coordinator: Arc<CoordinatorService>,
registry: Arc<ScriptRegistry>,
admin_auth: Option<Arc<dyn AdminAuth>>,
require_admin_auth: bool,
http_upsert_actor: Option<HttpUpsertActorProvider>,
}
impl ChrononStateBuilder {
#[must_use]
pub fn admin_auth(mut self, auth: Arc<dyn AdminAuth>) -> Self {
self.admin_auth = Some(auth);
self
}
#[must_use]
pub const fn require_admin_auth(mut self, require: bool) -> Self {
self.require_admin_auth = require;
self
}
#[must_use]
pub fn http_upsert_actor(
mut self,
provider: impl Fn() -> JsonValue + Send + Sync + 'static,
) -> Self {
self.http_upsert_actor = Some(Arc::new(provider));
self
}
pub fn build(self) -> Result<ChrononState> {
if self.require_admin_auth && self.admin_auth.is_none() {
return Err(ChrononError::Internal(
"CHRONON_REQUIRE_ADMIN_AUTH is set but no AdminAuth verifier was configured".into(),
));
}
Ok(ChrononState {
coordinator: self.coordinator,
registry: self.registry,
admin_auth: self.admin_auth,
require_admin_auth: self.require_admin_auth,
http_upsert_actor: self.http_upsert_actor,
})
}
}