use std::time::Duration;
use serde::{Deserialize, Serialize};
use wingfoil::adapters::web::*;
use wingfoil::*;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
struct PriceTick {
mid: f64,
count: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
struct UiEvent {
kind: String,
note: String,
}
fn main() -> anyhow::Result<()> {
env_logger::init();
let addr = std::env::var("WINGFOIL_WEB_ADDR").unwrap_or_else(|_| "127.0.0.1:8080".into());
let historical = std::env::var("WINGFOIL_WEB_HISTORICAL").is_ok();
let server = WebServer::bind(&addr).start()?;
let port = server.port();
let codec = server.codec();
let mode = if historical { "historical" } else { "realtime" };
println!(
"wingfoil web example listening on ws://127.0.0.1:{port}/ws (codec: {codec:?}, mode: {mode})"
);
let price_stream = ticker(Duration::from_millis(10))
.count()
.map(move |n| {
if historical {
std::thread::sleep(Duration::from_millis(20));
}
PriceTick {
mid: 100.0 + ((n as f64) * 0.1).sin(),
count: n,
}
})
.web_pub(&server, "price");
let ui_events: std::rc::Rc<dyn Stream<Burst<UiEvent>>> = web_sub(&server, "ui");
let ui_log = ui_events.collapse().for_each(|event, time| {
println!("{} ui-event: {:?}", time.pretty(), event);
});
let (run_mode, run_for) = if historical {
(RunMode::HistoricalFrom(NanoTime::ZERO), RunFor::Cycles(500))
} else {
(RunMode::RealTime, RunFor::Forever)
};
Graph::new(vec![price_stream, ui_log], run_mode, run_for).run()?;
Ok(())
}