use preserves_schema::Codec; use std::sync::Arc; use syndicate::actor::*; use syndicate::supervise::{Supervisor, SupervisorConfiguration}; use crate::language::language; use crate::schemas::external_services::{DaemonService, DaemonSpec}; use syndicate_macros::during; pub fn on_demand(t: &mut Activation, config_ds: Arc, root_ds: Arc) { t.spawn(syndicate::name!("on_demand", module = module_path!()), move |t| { Ok(during!(t, config_ds, language(), , |t| { let config_ds = Arc::clone(&config_ds); let root_ds = Arc::clone(&root_ds); Ok(Supervisor::start( t, syndicate::name!(parent: None, "daemon", service = ?spec), SupervisorConfiguration::default(), move |t| run(t, Arc::clone(&config_ds), Arc::clone(&root_ds), spec.clone()))) })) }); } fn run( t: &mut Activation, config_ds: Arc, _root_ds: Arc, service: DaemonService, ) -> ActorResult { { let spec = language().unparse(&service); config_ds.assert(t, &(), &syndicate_macros::template!("")); } let id = service.id.0.clone(); Ok(during!(t, config_ds, language(), , |_t| { if let Ok(config) = language().parse::(&config) { tracing::info!("daemon {:?} {:?}", &service, &config); } Ok(()) })) }