use std::sync::atomic::Ordering;
use std::thread;
use std::{
sync::{atomic::AtomicBool, mpsc::channel, Arc},
time::Instant,
};
use anor_storage::storage::Storage;
use anor_api::{
client::api_client::{SocketClient, StorageApiClient},
service::api_service::{ApiService, StorageApi},
};
use anor_utils::config;
fn main() {
let launch_start = Instant::now();
log4rs::init_file("log.yaml", Default::default()).unwrap();
log::info!("{} v{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
let config = config::load();
let storage = Storage::open_with_config(config.clone());
let api_service_config = config.clone();
let api_service_shutdown = Arc::new(AtomicBool::new(false));
let api_service_shutdown_clone = api_service_shutdown.clone();
let (api_service_ready_sender, api_service_ready_receiver) = channel();
let api_service_handler = thread::spawn(move || {
let service = StorageApi::with_config(storage, api_service_config);
if let Err(err) = service.start(api_service_shutdown_clone, api_service_ready_sender) {
log::error!("{}", err);
panic!("{}", err);
}
});
if let Err(err) = api_service_ready_receiver.recv() {
log::error!("{}", err);
panic!("{}", err);
}
let launch_elapsed = Instant::elapsed(&launch_start);
log::info!("Anor Storage API service started in {:?}", launch_elapsed);
let mut api_client1 = StorageApiClient::with_config(config.clone());
api_client1.connect().expect("client connection error");
let keys = api_client1.keys();
log::debug!("{:?}", keys);
api_service_shutdown.store(true, Ordering::SeqCst);
let mut api_client_terminate = StorageApiClient::with_config(config.clone());
api_client_terminate
.connect()
.expect("client connection error");
api_service_handler.join().unwrap();
log::info!("Anor Storage API service is shutdown successfully.");
}