#![feature(proc_macro_hygiene, decl_macro)] #[macro_use] extern crate rocket; #[macro_use] extern crate diesel; mod models; mod config; mod schema; mod routes; mod dns; use std::process::exit; use figment::{Figment, Profile, providers::{Format, Toml, Env}}; use rocket_sync_db_pools::database; use clap::{Parser, Subcommand}; use routes::users::*; use routes::zones::*; #[database("sqlite")] pub struct DbConn(diesel::SqliteConnection); #[derive(Parser)] #[clap(author, version, about, long_about = None)] #[clap(propagate_version = true)] struct Nomilo { #[clap(subcommand)] command: Command } #[derive(Subcommand)] enum Command { /// Lauch web server Serve, } fn serve(figment: Figment, app_config: config::Config) { rocket::async_main(async move { let _res = rocket::custom(figment) .manage(app_config) .attach(DbConn::fairing()) .mount("/api/v1", routes![ get_zone_records, create_zone_records, update_zone_records, delete_zone_records, get_zones, create_zone, add_member_to_zone, create_auth_token, create_user, ]) .launch().await; }); } fn main() { let figment = Figment::from(rocket::Config::default()) .merge(Toml::file(Env::var_or("NOMILO_CONFIG", "nomilo.toml")).nested()) .merge(Env::prefixed("NOMILO_").ignore(&["PROFILE"]).global()) .select(Profile::from_env_or("NOMILO_PROFILE", "release")); let app_config = match figment.extract::() { Ok(c) => c, Err(e) => { eprintln!("Error loading configuration: {}", e); exit(1); } }; let nomilo = Nomilo::parse(); match nomilo.command { Command::Serve => serve(figment, app_config), }; }