From ae6ab5352018aa121ec1be342a6cdd05e52d44ad Mon Sep 17 00:00:00 2001 From: Viyurz Date: Sun, 3 Mar 2024 14:12:55 +0100 Subject: [PATCH] Read config (ip/port) from file. --- config.toml | 2 ++ src/main.rs | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 config.toml diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..d327fe7 --- /dev/null +++ b/config.toml @@ -0,0 +1,2 @@ +ip = "0.0.0.0" +port = 8080 \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 4558cd5..0f5ca7e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,12 +18,19 @@ struct AppState { services: Vec, } +#[derive(Deserialize, Debug)] +struct Config { + ip: Option, + port: Option, + services: Option>, +} + #[derive(Deserialize)] struct ServiceVec { services: Vec, } -#[derive(Deserialize, Serialize)] +#[derive(Deserialize, Serialize, Debug)] struct Service { name: String, description: String, @@ -33,8 +40,21 @@ struct Service { repository_url: String, } +fn load_config() -> Config { + let config_str = read_to_string("config.toml").expect("Failed to read config.toml file."); + let services_str = read_to_string("services.toml").expect("Failed to read services.toml file."); + + let mut config: Config = toml::from_str(&config_str).unwrap(); + + let service_vec: ServiceVec = toml::from_str(&services_str).unwrap(); + config.services = Option::from(service_vec.services); + + return config; +} + // Minify templates before loading them -fn load_templates(env: &mut Environment) { +fn load_templates() -> Environment<'static> { + let mut env = Environment::new(); let cfg = minify_html::Cfg::spec_compliant(); for template_entry in fs::read_dir("./templates").expect("Failed to read directory ./templates.") { @@ -46,10 +66,14 @@ fn load_templates(env: &mut Environment) { env.add_template_owned(template_name, String::from_utf8(template_code_minified).unwrap()).unwrap(); } + + return env; } #[tokio::main] async fn main() { + let config: Config = load_config(); + tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| { @@ -61,17 +85,11 @@ async fn main() { .with(tracing_subscriber::fmt::layer()) .init(); - // Read services from file - let services_str = read_to_string("services.toml") - .expect("Failed to read services.toml file."); - let service_vec: ServiceVec = toml::from_str::(&services_str).unwrap(); - // init template engine and add templates - let mut env = Environment::new(); - load_templates(&mut env); + let env: Environment = load_templates(); // pass env & services to handlers via state - let app_state = Arc::new(AppState { env, services: service_vec.services }); + let app_state = Arc::new(AppState { env, services: config.services.unwrap() }); // define routes let app = Router::new() @@ -86,7 +104,9 @@ async fn main() { .with_state(app_state); // run it - let listener = tokio::net::TcpListener::bind("0.0.0.0:8080") + let listener = tokio::net::TcpListener::bind( + config.ip.expect("Missing 'ip' config parameter.") + + ":" + &config.port.expect("Missing 'port' config parameter.").to_string()) .await .unwrap(); println!("listening on {}", listener.local_addr().unwrap());