Start local server on client run

This commit is contained in:
2022-10-01 20:44:01 +02:00
parent 14c5820ed2
commit 7a06feb7cf
18 changed files with 88 additions and 18 deletions

View File

@ -11,4 +11,6 @@ clap = { version = "3.2.17", features = ["derive"] }
log = "0.4.17"
env_logger = "0.9.0"
tui = "0.19.0"
crossterm = "0.25.0"
crossterm = "0.25.0"
lazy_static = "1.4.0"
tokio = "1.21.2"

View File

@ -10,5 +10,32 @@ pub struct CliArgs {
value_parser,
default_value = "https://fixme.communiquons.org"
)]
server_uri: String,
pub server_uri: String,
/// Local server listen address
#[clap(short, long, default_value = "127.0.0.1:5679")]
pub listen_address: String,
}
impl CliArgs {
/// Get local listen port
pub fn listen_port(&self) -> u16 {
self.listen_address
.rsplit(':')
.next()
.expect("Failed to split listen address!")
.parse::<u16>()
.expect("Failed to parse listen port!")
}
}
lazy_static::lazy_static! {
static ref ARGS: CliArgs = {
CliArgs::parse()
};
}
/// Get parsed command line arguments
pub fn cli_args() -> &'static CliArgs {
&ARGS
}

View File

@ -1,2 +1,3 @@
pub mod cli_args;
pub mod server;
pub mod ui_screens;

View File

@ -12,9 +12,13 @@ use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
use env_logger::Env;
use tui::backend::CrosstermBackend;
use tui::Terminal;
use cli_player::server::start_server_if_missing;
pub fn main() -> Result<(), Box<dyn Error>> {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
#[tokio::main]
pub async fn main() -> Result<(), Box<dyn Error>> {
env_logger::Builder::from_env(Env::default()).init();
start_server_if_missing().await;
// setup terminal
enable_raw_mode()?;

View File

@ -0,0 +1,30 @@
use tokio::runtime::Builder;
use tokio::task;
use sea_battle_backend::args::Args;
use sea_battle_backend::utils::network_utils;
use crate::cli_args::cli_args;
pub async fn start_server_if_missing() {
if !network_utils::is_port_open(cli_args().listen_port()).await {
log::info!(
"Local server will start on {}...",
cli_args().listen_address
);
std::thread::spawn(move || {
let rt = Builder::new_current_thread().enable_all().build().unwrap();
let local_set = task::LocalSet::new();
rt.block_on(local_set.run_until(async move {
sea_battle_backend::server::start_server(Args {
listen_address: cli_args().listen_address.clone(),
cors: None,
})
.await
.expect("Failed to run local server!")
}));
});
}
}