diff --git a/nix/modules/default/default.nix b/nix/modules/default/default.nix index be66012c..aed8b1b7 100644 --- a/nix/modules/default/default.nix +++ b/nix/modules/default/default.nix @@ -85,17 +85,12 @@ in systemd.services.grapevine = { description = "Grapevine (Matrix homeserver)"; wantedBy = [ "multi-user.target" ]; - environment = lib.mkMerge [ - { - GRAPEVINE_CONFIG = configFile; - } - cfg.extraEnvironment - ]; + environment = cfg.extraEnvironment; # Keep sorted serviceConfig = { DynamicUser = true; - ExecStart = "${lib.getExe cfg.package}"; + ExecStart = "${lib.getExe cfg.package} --config ${configFile}"; LockPersonality = true; MemoryDenyWriteExecute = true; PrivateDevices = true; diff --git a/src/args.rs b/src/args.rs index 09cd3839..a54589b3 100644 --- a/src/args.rs +++ b/src/args.rs @@ -1,11 +1,17 @@ //! Integration with `clap` +use std::path::PathBuf; + use clap::Parser; /// Command line arguments #[derive(Parser)] #[clap(about, version = crate::version())] -pub(crate) struct Args; +pub(crate) struct Args { + /// Path to the configuration file + #[clap(long, short)] + pub(crate) config: PathBuf, +} /// Parse command line arguments into structured data pub(crate) fn parse() -> Args { diff --git a/src/error.rs b/src/error.rs index 33e3bfce..29dca26a 100644 --- a/src/error.rs +++ b/src/error.rs @@ -38,13 +38,6 @@ impl fmt::Display for DisplayWithSources<'_> { #[allow(missing_docs)] #[derive(Error, Debug)] pub(crate) enum Main { - #[error( - "the `{0}` environment variable must either be set to a configuration \ - file path or set to an empty string to force configuration through \ - environment variables" - )] - ConfigPathUnset(&'static str), - #[error("invalid configuration")] ConfigInvalid(#[from] figment::Error), diff --git a/src/main.rs b/src/main.rs index c68d3b29..bc390f3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -108,17 +108,11 @@ async fn main() -> ExitCode { async fn try_main() -> Result<(), error::Main> { use error::Main as Error; - args::parse(); + let args = args::parse(); // Initialize config let raw_config = Figment::new() - .merge( - Toml::file({ - let name = "GRAPEVINE_CONFIG"; - Env::var(name).ok_or(Error::ConfigPathUnset(name))? - }) - .nested(), - ) + .merge(Toml::file(&args.config).nested()) .merge(Env::prefixed("GRAPEVINE_").global()); let config = raw_config.extract::()?;