#[macro_use]
extern crate clap;
#[macro_use]
extern crate log;
use crate::params::Params;
use crate::server::{Server, TcpConnect};
use actix::{Actor, AsyncContext, Message, System};
use std::net;
use std::str::FromStr;
use std::sync::Arc;
use tokio::net::TcpListener;
pub mod dispatcher;
pub mod notifier;
pub mod session;
pub mod utils;
#[macro_use]
pub mod macros;
pub mod averager;
pub mod codec;
pub mod integrator;
pub mod logger;
pub mod params;
pub mod results;
pub mod server;
pub mod walker;
#[actix::main]
async fn main() {
let params = Arc::new(Params::from_command_line());
info!("{} thread(s) will be used for integration", params.threads);
let address = params.address();
let addr = net::SocketAddr::from_str(&address).unwrap();
let listener = match TcpListener::bind(&addr).await {
Ok(listener) => listener,
Err(err) => die!(
"Failed to start TCP/IP listener at port {}: {}",
params.port,
err
),
};
let server = Server::create(move |ctx| {
ctx.add_message_stream(async_stream::stream! {
while let Ok((st, addr)) = listener.accept().await {
yield TcpConnect(st, addr);
}
});
Server::new(params)
});
info!("Awaiting requests from clients at {}", &address);
tokio::signal::ctrl_c().await.unwrap();
info!("Ctrl-C received, shutting down");
server.do_send(Shutdown);
System::current().stop();
}
#[derive(Clone, Message)]
#[rtype(result = "()")]
pub(crate) struct Shutdown;