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 server = WebServer::bind(&addr).start()?;
let port = server.port();
let codec = server.codec();
println!("wingfoil web example listening on ws://127.0.0.1:{port}/ws (codec: {codec:?})");
let price_stream = ticker(Duration::from_millis(10))
.count()
.map(|n| 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);
});
Graph::new(
vec![price_stream, ui_log],
RunMode::RealTime,
RunFor::Forever,
)
.run()?;
Ok(())
}