diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 00000000..711717d7 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,76 @@ +mod error; +mod data; +mod proto; +mod rpc; +mod api; + +use structopt::StructOpt; +use futures::channel::oneshot; +use tokio::sync::Mutex; +use hyper::client::Client; + +use data::*; + + +#[derive(StructOpt, Debug)] +#[structopt(name = "garage")] +pub struct Opt { + #[structopt(long = "api-port", default_value = "3900")] + api_port: u16, + + #[structopt(long = "rpc-port", default_value = "3901")] + rpc_port: u16, +} + +pub struct System { + pub opt: Opt, + + pub rpc_client: Client<hyper::client::HttpConnector, hyper::Body>, + + pub network_members: Mutex<NetworkMembers>, +} + +async fn shutdown_signal(chans: Vec<oneshot::Sender<()>>) { + // Wait for the CTRL+C signal + tokio::signal::ctrl_c() + .await + .expect("failed to install CTRL+C signal handler"); + for ch in chans { + ch.send(()).unwrap(); + } +} + +async fn wait_from(chan: oneshot::Receiver<()>) -> () { + chan.await.unwrap() +} + +#[tokio::main] +async fn main() { + let opt = Opt::from_args(); + let rpc_port = opt.rpc_port; + let api_port = opt.api_port; + + let sys = System{ + opt, + rpc_client: Client::new(), + network_members: Mutex::new(NetworkMembers::default()), + }; + + let (tx1, rx1) = oneshot::channel(); + let (tx2, rx2) = oneshot::channel(); + + tokio::spawn(shutdown_signal(vec![tx1, tx2])); + + let rpc_server = rpc::run_rpc_server(&sys, rpc_port, wait_from(rx1)); + let api_server = api::run_api_server(&sys, api_port, wait_from(rx2)); + + let (e1, e2) = futures::join![rpc_server, api_server]; + + if let Err(e) = e1 { + eprintln!("RPC server error: {}", e) + } + + if let Err(e) = e2 { + eprintln!("API server error: {}", e) + } +} |