Lines
0 %
Functions
Branches
100 %
use actix_web::{web, App, HttpServer};
use log::info;
use ngi0review::{app, data::Data};
use std::path::PathBuf;
const HELP: &str = "\
USAGE:
ngi0review [OPTIONS]
FLAGS:
-h, --help Prints help information
OPTIONS:
--data DIR The directory with the data and configuration files.
--bind ADDRESS The interface address to bind to. (default: 127.0.0.1)
--port PORT The port to bind to. (default 8085)
";
struct Arguments {
data_dir: Option<PathBuf>,
bind: String,
port: u16,
}
fn parse_path(s: &std::ffi::OsStr) -> Result<std::path::PathBuf, &'static str> {
Ok(s.into())
fn parse_args() -> Result<Arguments, pico_args::Error> {
let mut pargs = pico_args::Arguments::from_env();
if pargs.contains(["-h", "--help"]) {
print!("{}", HELP);
std::process::exit(0);
let args = Arguments {
data_dir: pargs.opt_value_from_os_str("--data", parse_path)?,
bind: pargs
.opt_value_from_str("--bind")?
.unwrap_or_else(|| "127.0.0.1".into()),
port: pargs.opt_value_from_str("--port")?.unwrap_or(8085),
};
Ok(args)
#[actix_web::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("debug"));
let args = parse_args()?;
info!("Starting server on http://{}:{}", args.bind, args.port);
let data = web::Data::new(Data::new(
args.data_dir.unwrap_or_else(|| PathBuf::from("data")),
)?);
HttpServer::new(move || {
let mut cors = actix_cors::Cors::default()
.supports_credentials()
.allow_any_method()
.allow_any_header();
if data.config().allowed_origins.is_empty() {
cors = cors.allow_any_origin();
} else {
for allowed_origin in &data.config().allowed_origins {
cors = cors.allowed_origin(allowed_origin);
app!(data.clone(), cors)
})
.bind((args.bind, args.port))?
.run()
.await?;
Ok(())