diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-05-18 13:25:42 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-05-18 14:25:41 +0200 |
commit | 0717aca15929ff476ac92ec3bf2242943f817a64 (patch) | |
tree | 2fda01c02aa7ed0415d567449b1781db500cf8b7 | |
parent | 7da99d17d2220dcd19f0186c7f44bc34805a2970 (diff) |
Split server into subcommand
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/cli.rs | 15 | ||||
-rw-r--r-- | src/main.rs | 80 |
2 files changed, 59 insertions, 36 deletions
@@ -14,6 +14,21 @@ pub struct CLI { #[structopt(parse(from_os_str))] configfile: Option<PathBuf>, + + #[structopt(subcommand)] + cmd: Option<Command> +} + +impl CLI { + pub fn cmd(&self) -> Option<&Command> { + self.cmd.as_ref() + } +} + +#[derive(Debug, PartialEq, StructOpt)] +#[structopt(about = "Start the server part (running in foreground")] +pub enum Command { + Server, } pub fn cli() -> Result<CLI, Error> { diff --git a/src/main.rs b/src/main.rs index a3588f3..abd64e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -52,7 +52,7 @@ use anyhow::Error; use actix_web::{web, HttpResponse, Responder}; use crate::app::App; -use crate::cli::cli; +use crate::cli::*; use crate::configuration::Configuration; use crate::repository::repository::Repository; use crate::types::block::Block; @@ -66,7 +66,12 @@ use crate::types::util::Version; use std::process::exit; -fn main() -> Result<()> { +fn start_server(cli: &CLI) -> bool { + cli.cmd().map(|cmd| Command::Server == *cmd).unwrap_or(false) +} + +#[actix_rt::main] +async fn main() -> Result<()> { let cli = cli()?; let _ = env_logger::init(); let port = port_check::free_local_port().expect("Could not find free port"); @@ -82,29 +87,9 @@ fn main() -> Result<()> { ::toml::from_str(&configstr)? }; - let app = { - let device_name = config.get_device_name(); - let device_key = config.get_device_key(); - - if let (Some(name), Some(key)) = (device_name, device_key) { - let name = IPNSHash::from(name.clone()); - let key = key.clone(); - let api_url = config.get_api_url().clone(); - let api_port = config.get_api_port().clone(); - - App::load(name, key, &api_url, api_port) - } else { - // ask user for name(s) - // boot repository - // load App object - unimplemented!() - } - }; - let adr = format!("127.0.0.1:{}", port); - let webview_content = web_view::Content::Url(adr.clone()); - actix_rt::spawn(async move { + if start_server(&cli) { actix_web::HttpServer::new(|| { actix_web::App::new() .service(actix_web::web::resource("/{name}/{id}/index.html").to(index)) @@ -113,19 +98,42 @@ fn main() -> Result<()> { .expect(&format!("Could not bind to address {}", adr)) .run() .await; - }); - - web_view::builder() - .title("My Project") - .content(webview_content) - .resizable(true) - .debug(true) - .user_data(()) - .invoke_handler(|_webview, _arg| Ok(())) - .build() - .map_err(Error::from)? - .run() - .map_err(Error::from) + + Ok(()) + } else { + let app = { + let device_name = config.get_device_name(); + let device_key = config.get_device_key(); + + if let (Some(name), Some(key)) = (device_name, device_key) { + let name = IPNSHash::from(name.clone()); + let key = key.clone(); + let api_url = config.get_api_url().clone(); + let api_port = config.get_api_port().clone(); + + App::load(name, key, &api_url, api_port) + } else { + // ask user for name(s) + // boot repository + // load App object + unimplemented!() + } + }; + + let webview_content = web_view::Content::Url(adr.clone()); + + web_view::builder() + .title("My Project") + .content(webview_content) + .resizable(true) + .debug(true) + .user_data(()) + .invoke_handler(|_webview, _arg| Ok(())) + .build() + .map_err(Error::from)? + .run() + .map_err(Error::from) + } } async fn index() -> impl Responder { |