syndicate-rs/syndicate-server/src/services/daemon.rs

47 lines
1.4 KiB
Rust
Raw Normal View History

use preserves_schema::Codec;
use std::sync::Arc;
use syndicate::actor::*;
use syndicate::supervise::{Supervisor, SupervisorConfiguration};
use crate::language::language;
2021-09-20 13:43:00 +00:00
use crate::schemas::external_services::{DaemonService, DaemonSpec};
use syndicate_macros::during;
pub fn on_demand(t: &mut Activation, config_ds: Arc<Cap>, root_ds: Arc<Cap>) {
t.spawn(syndicate::name!("on_demand", module = module_path!()), move |t| {
2021-09-20 13:10:31 +00:00
Ok(during!(t, config_ds, language(), <require-service $spec: DaemonService>, |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())))
2021-09-20 13:10:31 +00:00
}))
});
}
fn run(
t: &mut Activation,
config_ds: Arc<Cap>,
_root_ds: Arc<Cap>,
2021-09-20 13:43:00 +00:00
service: DaemonService,
) -> ActorResult {
{
2021-09-20 13:43:00 +00:00
let spec = language().unparse(&service);
config_ds.assert(t, &(), &syndicate_macros::template!("<service-running =spec>"));
}
2021-09-20 13:43:00 +00:00
let id = service.id.0.clone();
2021-09-20 13:43:00 +00:00
Ok(during!(t, config_ds, language(), <daemon #(id) $config>, |_t| {
if let Ok(config) = language().parse::<DaemonSpec>(&config) {
tracing::info!("daemon {:?} {:?}", &service, &config);
}
Ok(())
}))
}