use std::net::SocketAddr;
use chrono::prelude::*;
use dfir_rs::dfir_syntax;
use dfir_rs::util::bind_udp_lines;
use crate::Opts;
use crate::helpers::{deserialize_json, print_graph, serialize_json};
use crate::protocol::EchoMsg;
pub(crate) async fn run_server(opts: Opts) {
let server_address = opts.address;
println!("Starting server on {:?}", server_address);
let (outbound, inbound, actual_server_addr) = bind_udp_lines(server_address).await;
println!("Server is live! Listening on {:?}", actual_server_addr);
let mut flow = dfir_syntax! {
inbound_chan = source_stream(inbound) -> map(deserialize_json) -> tee();
inbound_chan[0] -> for_each(|(m, a): (EchoMsg, SocketAddr)| println!("Got {:?} from {:?}", m, a));
inbound_chan[1] -> map(|(EchoMsg { payload, .. }, addr)| (EchoMsg { payload, ts: Utc::now() }, addr))
-> map(|(m, a)| (serialize_json(m), a))
-> dest_sink(outbound);
};
if let Some(graph) = opts.graph {
print_graph(&flow, graph, opts.write_config);
}
flow.run().await;
}