use std::io::{Stderr, Write};
use std::sync::{Arc, Mutex};
use std::time::Duration;
use std::{io, thread};
use storyteller::{EventHandler, FinishProcessing};
use storyteller::{
event_channel, ChannelEventListener, ChannelReporter, EventListener, EventReporter,
};
fn main() {
let (sender, receiver) = event_channel::<ExampleEvent>();
let handler = JsonHandler::default();
let reporter = ChannelReporter::new(sender);
let listener = ChannelEventListener::new(receiver);
let fin = listener.run_handler(Arc::new(handler));
#[allow(unused_must_use)]
{
reporter.report_event(ExampleEvent::text("[status] One"));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::text("[status::before] Two before reset"));
reporter.report_event(ExampleEvent::event(MyEvent::Reset));
reporter.report_event(ExampleEvent::text("[status::after] Two after reset"));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::text("[status] Three"));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::event(MyEvent::Increment));
reporter.report_event(ExampleEvent::text("[status] Four"));
}
let _ = reporter.disconnect();
let _ = fin.finish_processing();
}
enum ExampleEvent {
Event(MyEvent),
Text(String),
}
impl ExampleEvent {
pub fn event(event: MyEvent) -> Self {
Self::Event(event)
}
pub fn text<T: AsRef<str>>(text: T) -> Self {
Self::Text(text.as_ref().to_string())
}
}
impl ExampleEvent {
pub fn to_json(&self) -> String {
match self {
Self::Event(event) => event.to_json(),
Self::Text(msg) => format!("{{ \"event\" : \"message\", \"value\" : \"{}\" }}", msg),
}
}
}
enum MyEvent {
Increment,
Reset,
}
impl MyEvent {
pub fn to_json(&self) -> String {
match self {
Self::Increment => format!("{{ \"event\" : \"increment\" }}"),
Self::Reset => format!("{{ \"event\" : \"reset\" }}"),
}
}
}
struct JsonHandler {
stream: Arc<Mutex<Stderr>>,
}
impl Default for JsonHandler {
fn default() -> Self {
Self {
stream: Arc::new(Mutex::new(io::stderr())),
}
}
}
impl EventHandler for JsonHandler {
type Event = ExampleEvent;
fn handle(&self, event: Self::Event) {
thread::sleep(Duration::from_secs(1));
let message = event.to_json();
let mut out = self.stream.lock().unwrap();
let _ = writeln!(out, "{}", message);
let _ = out.flush();
}
fn finish(&self) {
let mut out = self.stream.lock().unwrap();
let message = format!("{{ \"event\" : \"program-finished\", \"success\" : true }}");
let _ = writeln!(out, "{}", message);
let _ = out.flush();
}
}