PaperTrader/src/libtrader/server/initializer.rs

98 lines
3.2 KiB
Rust

use std::net;
use mio::net::TcpListener;
use crate::common::misc::path_exists::path_exists;
use crate::common::misc::gen_tls_server_config::gen_tls_server_config;
use crate::common::misc::return_flags::ReturnFlags;
use crate::server::network::tls_server::TlsServer;
#[cfg(not(debug_assertions))]
use crate::common::misc::gen_log::gen_log;
/// Initializes global logger.
///
/// Private function used by libtrader_init() to initialize the logger. Log destinations are
/// platfrom dependent.
/// On unix systems: /var/log/papertrader/
/// On windows/unkown systems: $(pwd)/log/
///
/// Returns: nothing on success, on error contains the reason of failure.
///
/// Example:
/// ```rust
/// match libtrader_init_log() {
/// Ok(()) => {},
/// Err(err) => panic!("failed initializing log, reason: {}", err)
/// };
/// ```
///
fn libtrader_init_log() -> Result<(), ReturnFlags> {
info!("Started Logger.");
#[cfg(not(debug_assertions))]
gen_log();
#[cfg(debug_assertions)] {
use simplelog::*;
use std::fs::File;
if !path_exists("log") {
match std::fs::create_dir("log") {
Ok(()) => {},
Err(_err) => return Err(ReturnFlags::COMMON_GEN_LOG_DIR_CREATION_FAILED)
};
}
CombinedLogger::init(vec![
#[cfg(debug_assertions)]
TermLogger::new(LevelFilter::Warn, Config::default(), TerminalMode::Mixed),
#[cfg(not(debug_assertions))]
TermLogger::new(LevelFilter::Warn, Config::default(), TerminalMode::Mixed),
WriteLogger::new(LevelFilter::Info, Config::default(),
File::create(format!("log/log-{}.txt",
chrono::Utc::now().to_rfc2822())).unwrap())
]).unwrap();
};
Ok(())
}
/// Server Initialization of the library.
///
/// Public function that initializes the library, and starts the libtrader server.
/// This function should not return.
///
/// Example:
/// ```rust
/// libtrader_init_server()?;
/// ```
pub fn libtrader_init_server() -> Result<(), ReturnFlags> {
// Initialize log.
#[cfg(not(test))]
match libtrader_init_log() {
Ok(()) => {},
Err(err) => return Err(ReturnFlags::LIBTRADER_INIT_LOG_FAILED | err),
};
let addr: net::SocketAddr = "0.0.0.0:4000".parse().unwrap();
let config = gen_tls_server_config("certs/test_tls.crt", "certs/test_tls.key", None);
let mut listener = TcpListener::bind(addr).expect("LIBTRADER_INIT_SERVER_FAILED");
let mut poll = mio::Poll::new().unwrap();
poll.registry().register(&mut listener, mio::Token(0), mio::Interest::READABLE).unwrap();
let mut tls_server = TlsServer::new(listener, config);
let mut events = mio::Events::with_capacity(256);
loop {
poll.poll(&mut events, None).unwrap();
for event in &events {
match event.token() {
mio::Token(0) => {
tls_server.accept(poll.registry()).expect("error accepting socket");
},
_ => tls_server.conn_event(poll.registry(), &event)
}
}
}
}