From ee22233788ac9ee5c04803ae47951bbfca232593 Mon Sep 17 00:00:00 2001 From: Honbra Date: Thu, 19 Oct 2023 00:18:18 +0200 Subject: [PATCH] Add config --- Cargo.lock | 139 +++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/app/mod.rs | 4 +- src/config.rs | 13 +++++ src/main.rs | 36 +++++++++---- 5 files changed, 181 insertions(+), 12 deletions(-) create mode 100644 src/config.rs diff --git a/Cargo.lock b/Cargo.lock index 0ff97f4..de2901f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,6 +52,15 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "atomic" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +dependencies = [ + "bytemuck", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -166,6 +175,12 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad152d03a2c813c80bb94fedbf3a3f02b28f793e39e7c214c8a0bcc196343de7" +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + [[package]] name = "bytes" version = "1.5.0" @@ -380,6 +395,20 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "figment" +version = "0.10.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a014ac935975a70ad13a3bff2463b1c1b083b35ae4cb6309cfc59476aa7a181f" +dependencies = [ + "atomic", + "pear", + "serde", + "toml", + "uncased", + "version_check", +] + [[package]] name = "fnv" version = "1.0.7" @@ -525,6 +554,7 @@ version = "0.1.0" dependencies = [ "axum", "eyre", + "figment", "http", "lazy_static", "maud", @@ -684,6 +714,12 @@ dependencies = [ "serde", ] +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + [[package]] name = "ipnet" version = "2.8.0" @@ -916,6 +952,29 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pear" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a386cd715229d399604b50d1361683fe687066f42d56f54be995bc6868f71c" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f0f13dac8069c139e8300a6510e3f4143ecf5259c60b116a9b271b4ca0d54" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.38", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -993,6 +1052,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", + "version_check", + "yansi", +] + [[package]] name = "pulldown-cmark" version = "0.9.3" @@ -1257,6 +1329,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1563,6 +1644,40 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.0.2", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -1680,6 +1795,15 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "uncased" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" +dependencies = [ + "version_check", +] + [[package]] name = "unicase" version = "2.7.0" @@ -1961,6 +2085,15 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "winnow" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -1970,3 +2103,9 @@ dependencies = [ "cfg-if", "windows-sys", ] + +[[package]] +name = "yansi" +version = "1.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377" diff --git a/Cargo.toml b/Cargo.toml index c1eaafc..bb9d3d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] axum = { version = "0.6.20", default-features = false, features = ["http1", "json", "macros", "matched-path", "tokio", "tower-log", "tracing"] } eyre = "0.6.8" +figment = { version = "0.10.11", features = ["env", "toml"] } http = "0.2.9" lazy_static = "1.4.0" maud = { version = "0.25.0", features = ["axum"] } diff --git a/src/app/mod.rs b/src/app/mod.rs index 51d3452..172290b 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -5,7 +5,9 @@ use http::Request; use tower_http::trace::{DefaultOnRequest, DefaultOnResponse, TraceLayer}; use tracing::{field, span, Level}; -pub fn build_app() -> Router { +use crate::config::Config; + +pub fn build_app(_config: Config) -> Router { Router::new().nest("/yt-embed", yt_embed::router()).layer( TraceLayer::new_for_http() .make_span_with(|request: &Request| { diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..b738322 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,13 @@ +use std::net::SocketAddr; + +use serde::Deserialize; + +#[derive(Clone, Debug, Deserialize)] +pub struct Config { + #[serde(default = "default_listen_addr")] + pub listen_addr: SocketAddr, +} + +fn default_listen_addr() -> SocketAddr { + ([0, 0, 0, 0], 3000).into() +} diff --git a/src/main.rs b/src/main.rs index ae6a3bc..b829773 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,22 @@ mod app; +mod config; mod error; mod reqwest; mod youtube; -use std::net::SocketAddr; - use eyre::Context; +use figment::{ + providers::{Env, Format, Toml}, + Figment, +}; +use tokio::runtime::Runtime; use tracing::{debug, field, Level}; use tracing_subscriber::{filter, layer::SubscriberExt, util::SubscriberInitExt}; use self::app::build_app; +use crate::config::Config; -#[tokio::main] -async fn main() -> eyre::Result<()> { +fn main() -> eyre::Result<()> { let filter = filter::Targets::new() .with_target("honbra_api", Level::TRACE) .with_target("tower_http::trace::on_response", Level::TRACE) @@ -28,15 +32,25 @@ async fn main() -> eyre::Result<()> { .map_err(eyre::Error::msg) .context("failed to initialize tracing subscriber")?; - let addr: SocketAddr = ([0, 0, 0, 0], 3000).into(); + let config: Config = Figment::new() + .merge(Toml::file("config.toml")) + .merge(Env::raw()) + .extract() + .context("failed to parse config")?; - debug!(addr = field::display(addr), "binding"); + let rt = Runtime::new().context("failed to create tokio runtime")?; - axum::Server::try_bind(&addr) - .context("unable to bind to server address")? - .serve(build_app().into_make_service()) - .await - .context("server encountered a runtime error")?; + debug!(addr = field::display(&config.listen_addr), "binding"); + + rt.block_on(async move { + Ok::<(), eyre::Error>( + axum::Server::try_bind(&config.listen_addr) + .context("unable to bind to server address")? + .serve(build_app(config).into_make_service()) + .await + .context("server encountered a runtime error")?, + ) + })?; Ok(()) }