2021-09-19 14:53:37 +00:00
|
|
|
use preserves_schema::Codec;
|
|
|
|
|
2021-08-27 14:19:14 +00:00
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
use syndicate::actor::*;
|
|
|
|
use syndicate::during::DuringResult;
|
|
|
|
use syndicate::schemas::gatekeeper;
|
2021-08-27 14:35:45 +00:00
|
|
|
use syndicate::sturdy;
|
2021-08-27 14:19:14 +00:00
|
|
|
use syndicate::value::NestedValue;
|
|
|
|
|
2021-09-19 14:53:37 +00:00
|
|
|
use crate::language::language;
|
|
|
|
|
2021-08-27 14:35:45 +00:00
|
|
|
pub fn bind(
|
|
|
|
t: &mut Activation,
|
2021-08-28 12:39:00 +00:00
|
|
|
ds: &Arc<Cap>,
|
2021-08-27 14:35:45 +00:00
|
|
|
oid: syndicate::schemas::sturdy::_Any,
|
|
|
|
key: [u8; 16],
|
|
|
|
target: Arc<Cap>,
|
|
|
|
) {
|
|
|
|
let sr = sturdy::SturdyRef::mint(oid.clone(), &key);
|
2021-09-19 14:53:37 +00:00
|
|
|
tracing::info!(cap = ?language().unparse(&sr), hex = %sr.to_hex());
|
|
|
|
ds.assert(t, language(), &gatekeeper::Bind { oid, key: key.to_vec(), target });
|
2021-08-27 14:35:45 +00:00
|
|
|
}
|
|
|
|
|
2021-08-27 14:19:14 +00:00
|
|
|
pub fn handle_resolve(
|
|
|
|
ds: &mut Arc<Cap>,
|
|
|
|
t: &mut Activation,
|
|
|
|
a: gatekeeper::Resolve,
|
|
|
|
) -> DuringResult<Arc<Cap>> {
|
|
|
|
use syndicate::schemas::dataspace;
|
|
|
|
|
|
|
|
let gatekeeper::Resolve { sturdyref, observer } = a;
|
|
|
|
let queried_oid = sturdyref.oid.clone();
|
|
|
|
let handler = syndicate::entity(observer)
|
|
|
|
.on_asserted(move |observer, t, a: AnyValue| {
|
|
|
|
let bindings = a.value().to_sequence()?;
|
|
|
|
let key = bindings[0].value().to_bytestring()?;
|
|
|
|
let unattenuated_target = bindings[1].value().to_embedded()?;
|
|
|
|
match sturdyref.validate_and_attenuate(key, unattenuated_target) {
|
|
|
|
Err(e) => {
|
2021-09-19 14:53:37 +00:00
|
|
|
tracing::warn!(sturdyref = ?language().unparse(&sturdyref),
|
2021-08-27 14:19:14 +00:00
|
|
|
"sturdyref failed validation: {}", e);
|
|
|
|
Ok(None)
|
|
|
|
},
|
|
|
|
Ok(target) => {
|
2021-09-19 14:53:37 +00:00
|
|
|
tracing::trace!(sturdyref = ?language().unparse(&sturdyref),
|
2021-08-30 10:06:40 +00:00
|
|
|
?target,
|
2021-08-27 14:19:14 +00:00
|
|
|
"sturdyref resolved");
|
2021-09-19 14:53:37 +00:00
|
|
|
if let Some(h) = observer.assert(t, &(), &AnyValue::domain(target)) {
|
2021-08-27 14:19:14 +00:00
|
|
|
Ok(Some(Box::new(move |_observer, t| Ok(t.retract(h)))))
|
|
|
|
} else {
|
|
|
|
Ok(None)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.create_cap(t);
|
2021-09-19 14:53:37 +00:00
|
|
|
if let Some(oh) = ds.assert(t, language(), &dataspace::Observe {
|
2021-08-27 14:19:14 +00:00
|
|
|
// TODO: codegen plugin to generate pattern constructors
|
2021-08-31 14:19:29 +00:00
|
|
|
pattern: syndicate_macros::pattern!{<bind #(queried_oid) $ $>},
|
2021-08-27 14:19:14 +00:00
|
|
|
observer: handler,
|
|
|
|
}) {
|
|
|
|
Ok(Some(Box::new(move |_ds, t| Ok(t.retract(oh)))))
|
|
|
|
} else {
|
|
|
|
Ok(None)
|
|
|
|
}
|
|
|
|
}
|