bubbles 4.2.0

Bubble integration server for powder diffraction
#[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;