use std::net::SocketAddr;
use chrono::prelude::*;
use dfir_rs::dfir_syntax;
use dfir_rs::util::{bind_udp_lines, ipv4_resolve};
use crate::Opts;
use crate::helpers::{deserialize_json, print_graph, serialize_json};
use crate::protocol::EchoMsg;
pub(crate) async fn run_client(opts: Opts) {
let client_addr = ipv4_resolve("localhost:0").unwrap();
let server_addr = opts.address;
assert_ne!(
0,
server_addr.port(),
"Client cannot connect to server port 0."
);
let (outbound, inbound, allocated_client_addr) = bind_udp_lines(client_addr).await;
println!(
"Client is live! Listening on {:?} and talking to server on {:?}",
allocated_client_addr, server_addr
);
let mut flow = dfir_syntax! {
source_stdin() -> map(|l| (EchoMsg{ payload: l.unwrap(), ts: Utc::now(), }, server_addr) )
-> map(|(msg, addr)| (serialize_json(msg), addr))
-> dest_sink(outbound);
source_stream(inbound) -> map(deserialize_json)
-> for_each(|(m, _a): (EchoMsg, SocketAddr) | println!("{:?}", m));
};
if let Some(graph) = opts.graph {
print_graph(&flow, graph, opts.write_config);
}
flow.run().await;
}