fix: config file parse errors not reported as missing DATABASE_URL

This commit is contained in:
2026-10-25 21:02:35 +01:00
parent 8bdf55cfe1
commit 1f724bb064
4 changed files with 16 additions and 50 deletions

49
Cargo.lock generated
View File

@@ -1952,7 +1952,6 @@ checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3"
dependencies = [ dependencies = [
"atomic", "atomic",
"parking_lot", "parking_lot",
"pear",
"serde", "serde",
"tempfile", "tempfile",
"toml", "toml",
@@ -2775,12 +2774,6 @@ dependencies = [
"sqlx", "sqlx",
] ]
[[package]]
name = "inlinable_string"
version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
[[package]] [[package]]
name = "inout" name = "inout"
version = "0.1.4" version = "0.1.4"
@@ -3700,29 +3693,6 @@ version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pear"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467"
dependencies = [
"inlinable_string",
"pear_codegen",
"yansi",
]
[[package]]
name = "pear_codegen"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147"
dependencies = [
"proc-macro2",
"proc-macro2-diagnostics",
"quote",
"syn 2.0.117",
]
[[package]] [[package]]
name = "pem" name = "pem"
version = "3.0.6" version = "3.0.6"
@@ -4084,19 +4054,6 @@ dependencies = [
"unicode-ident", "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.117",
"version_check",
"yansi",
]
[[package]] [[package]]
name = "profiling" name = "profiling"
version = "1.0.18" version = "1.0.18"
@@ -7244,12 +7201,6 @@ version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
[[package]]
name = "yansi"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
[[package]] [[package]]
name = "yoke" name = "yoke"
version = "0.8.2" version = "0.8.2"

View File

@@ -64,7 +64,7 @@ hex = "0.4"
object_store = { version = "0.11", features = ["aws"] } object_store = { version = "0.11", features = ["aws"] }
axum = { version = "0.8.8", features = ["macros", "multipart"] } axum = { version = "0.8.8", features = ["macros", "multipart"] }
csv = "1" csv = "1"
figment = { version = "0.10", features = ["toml", "env"] } figment = { version = "0.10", features = ["toml"] }
api-types = { path = "crates/api-types" } api-types = { path = "crates/api-types" }
domain = { path = "crates/domain" } domain = { path = "crates/domain" }

View File

@@ -98,6 +98,9 @@ pub fn load() -> Result<AppConfig, ConfigError> {
let figment = Figment::new().merge(Toml::file(path)).merge(LegacyEnv); let figment = Figment::new().merge(Toml::file(path)).merge(LegacyEnv);
figment
.data()
.map_err(|e| ConfigError::Unreadable(Box::new(e)))?;
if figment.find_value("database.url").is_err() { if figment.find_value("database.url").is_err() {
return Err(ConfigError::Missing("DATABASE_URL")); return Err(ConfigError::Missing("DATABASE_URL"));
} }

View File

@@ -377,3 +377,15 @@ fn secure_cookies_and_image_conversion_accept_true_only() {
Ok(()) Ok(())
}); });
} }
#[test]
fn malformed_config_file_reports_the_file_not_a_missing_database_url() {
Jail::expect_with(|jail| {
jail_with(jail, &[]);
jail.create_file("config.toml", "[server\nport = = 1\n")?;
let err = load().expect_err("config.toml is malformed");
assert!(matches!(err, ConfigError::Unreadable(_)), "{err}");
assert!(!err.to_string().contains("DATABASE_URL"), "{err}");
Ok(())
});
}