use std::sync::atomic::{AtomicU32, Ordering};
use std::sync::Arc;
use std::thread;
use std::time::Duration;
use storyteller::{EventHandler, FinishProcessing};
use storyteller::{
event_channel, ChannelEventListener, ChannelReporter, EventListener, EventReporter,
};
#[derive(serde::Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
enum Event {
DiceThrow { throw: u8 },
YouWin,
YouLose,
}
#[derive(Default)]
struct JsonHandler;
impl EventHandler for JsonHandler {
type Event = Event;
fn handle(&self, event: Self::Event) {
let serialized_event = serde_json::to_string(&event).unwrap();
println!("{}", serialized_event);
}
}
fn main() {
let (sender, receiver) = event_channel::<Event>();
let handler = JsonHandler::default();
let reporter = ChannelReporter::new(sender);
let listener = ChannelEventListener::new(receiver);
let fin = listener.run_handler(Arc::new(handler));
for _ in 0..100 {
let dice = roll_dice();
reporter
.report_event(Event::DiceThrow { throw: dice })
.unwrap();
if dice >= 3 {
reporter.report_event(Event::YouWin).unwrap();
} else {
reporter.report_event(Event::YouLose).unwrap();
}
thread::sleep(Duration::from_millis(100))
}
let _ = reporter.disconnect();
let _ = fin.finish_processing();
}
static SEED: AtomicU32 = AtomicU32::new(1);
fn roll_dice() -> u8 {
let mut random = SEED.load(Ordering::SeqCst);
random ^= random << 13;
random ^= random >> 17;
random ^= random << 5;
SEED.store(random, Ordering::SeqCst);
(random % 6 + 1) as u8
}