use active_rpc::domain::{module_from_source, ModuleProvider};
use active_rpc::{Agent, Arg, Budget, CapAttrs, Value};
fn main() -> Result<(), active_rpc::Error> {
let mut provider = ModuleProvider::new();
let object = provider.install(module_from_source(
"port = 8080\nname = \"loopback\"\n",
"loopback.active",
)?);
let agent = Agent::new();
let provider_id = agent.register(Box::new(provider));
let cap = agent.mint(provider_id, object, CapAttrs::new(&["stats", "why"]))?;
let lane = agent.create_lane("demo", Budget::default())?;
let stats = agent.call(lane, &cap, "stats", vec![])?;
println!("stats: {:?}", stats.value()?);
let why = agent.call(
lane,
&cap,
"why",
vec![Arg::Value(Value::Path("port".to_string()))],
)?;
println!("why: {:?}", why.value()?);
drop(cap);
println!("drop notifications: {:?}", agent.take_drops(provider_id));
let narrow = agent.mint(provider_id, object, CapAttrs::new(&["stats"]))?;
match agent.call(lane, &narrow, "why", vec![Arg::Value(Value::Null)]) {
Ok(_) => println!("unexpected: the method should be denied"),
Err(error) => println!("denied as expected: {error}"),
}
Ok(())
}