syndicate-rs/examples/producer.rs

61 lines
1.9 KiB
Rust
Raw Normal View History

2021-07-15 07:13:31 +00:00
use std::sync::Arc;
use structopt::StructOpt;
2021-07-15 07:13:31 +00:00
use syndicate::actor::*;
use syndicate::relay;
use syndicate::sturdy;
use syndicate::value::NestedValue;
use syndicate::value::Value;
use tokio::net::TcpStream;
#[derive(Clone, Debug, StructOpt)]
pub struct Config {
#[structopt(short = "a", default_value = "1")]
action_count: u32,
2020-06-15 20:13:21 +00:00
#[structopt(short = "b", default_value = "0")]
bytes_padding: usize,
2021-07-15 07:13:31 +00:00
#[structopt(short = "d", default_value = "b4b303726566b10973796e646963617465b584b210a6480df5306611ddd0d3882b546e197784")]
dataspace: String,
}
2020-05-11 21:31:00 +00:00
2020-06-15 14:15:52 +00:00
#[inline]
2021-07-15 07:13:31 +00:00
fn says(who: _Any, what: _Any) -> _Any {
2020-06-15 14:15:52 +00:00
let mut r = Value::simple_record("Says", 2);
r.fields_vec_mut().push(who);
r.fields_vec_mut().push(what);
r.finish().wrap()
}
2020-05-11 21:31:00 +00:00
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
2021-07-15 07:13:31 +00:00
syndicate::convenient_logging()?;
Actor::new().boot(syndicate::name!("producer"), |t| Box::pin(async move {
let config = Config::from_args();
let sturdyref = sturdy::SturdyRef::from_hex(&config.dataspace)?;
let (i, o) = TcpStream::connect("127.0.0.1:8001").await?.into_split();
relay::connect_stream(t, i, o, sturdyref, (), move |_state, t, ds| {
let padding: _Any = Value::ByteString(vec![0; config.bytes_padding]).wrap();
let action_count = config.action_count;
let producer = syndicate::entity(Arc::clone(&*INERT_REF))
.on_message(move |self_ref, t, _m| {
for _ in 0..action_count {
t.message(&ds, says(Value::from("producer").wrap(), padding.clone()));
}
t.message(&self_ref, _Any::new(true));
Ok(())
})
.create_rec(t.actor, |_ac, self_ref, p_ref| *self_ref = Arc::clone(p_ref));
t.message(&producer, _Any::new(true));
Ok(None)
});
Ok(())
})).await??;
Ok(())
2020-05-11 21:31:00 +00:00
}