diff --git a/syndicate-server/src/script/mod.rs b/syndicate-server/src/script/mod.rs index 3c32a2e..1df4189 100644 --- a/syndicate-server/src/script/mod.rs +++ b/syndicate-server/src/script/mod.rs @@ -83,6 +83,7 @@ pub enum Expr { }, Dataspace, Timestamp, + Facet, } #[derive(Debug, Clone)] @@ -105,12 +106,31 @@ enum Symbolic { Bare(String), } +struct FacetHandle; + impl Default for Parsed { fn default() -> Self { Parsed::Skip } } +impl FacetHandle { + fn new() -> Self { + FacetHandle + } +} + +impl Entity for FacetHandle { + fn message(&mut self, t: &mut Activation, body: AnyValue) -> ActorResult { + if let Some("stop") = body.value().as_symbol().map(|s| s.as_str()) { + t.stop(); + return Ok(()) + } + tracing::warn!(?body, "Unrecognised message sent to FacetHandle"); + return Ok(()) + } +} + fn analyze(s: &str) -> Symbolic { if s == "_" { Symbolic::Discard @@ -421,7 +441,9 @@ impl Env { let (binding_names, pattern) = self.instantiate_pattern(pattern_template)?; let observer = during::entity(self.clone()) .on_message(enclose!((binding_names, body) move |env, t, cs: AnyValue| { - env.bind_and_run(t, &binding_names, cs, &*body) })) + t.facet(|t| env.bind_and_run(t, &binding_names, cs, &*body))?; + Ok(()) + })) .create_cap(t); self.lookup_target(target)?.assert(t, language(), &dataspace::Observe { pattern, @@ -459,6 +481,7 @@ impl Env { Expr::Template { template } => self.instantiate_value(template), Expr::Dataspace => Ok(AnyValue::domain(Cap::new(&t.create(Dataspace::new())))), Expr::Timestamp => Ok(AnyValue::new(chrono::Utc::now().to_rfc3339())), + Expr::Facet => Ok(AnyValue::domain(Cap::new(&t.create(FacetHandle::new())))), } } @@ -809,6 +832,11 @@ impl<'t> Parser<'t> { return Some(Expr::Timestamp); } + if self.peek() == &Value::symbol("facet") { + self.drop(); + return Some(Expr::Facet); + } + return Some(Expr::Template{ template: self.shift() }); } }