diff options
author | Quentin <quentin@dufour.io> | 2021-08-19 08:32:53 +0200 |
---|---|---|
committer | Quentin <quentin@dufour.io> | 2021-08-19 08:32:53 +0200 |
commit | fa25c54e47decf9f323ba0c614f4d9de106626d5 (patch) | |
tree | 2f4524b06b95d8522166732feff59e7246fa86e1 /src/config/options.rs | |
parent | 8b57fb2680673c4ee5a425b262e190fcef724a25 (diff) | |
parent | 0f114f21344ddb59f50fed68540c54c41300cf51 (diff) | |
download | diplonat-fa25c54e47decf9f323ba0c614f4d9de106626d5.tar.gz diplonat-fa25c54e47decf9f323ba0c614f4d9de106626d5.zip |
Merge pull request 'Environment parsing done with Serde Envy' (#5) from adrien/diplonat:feature/config-handling into main
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/diplonat/pulls/5
Diffstat (limited to 'src/config/options.rs')
-rw-r--r-- | src/config/options.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/config/options.rs b/src/config/options.rs new file mode 100644 index 0000000..36da475 --- /dev/null +++ b/src/config/options.rs @@ -0,0 +1,76 @@ +use anyhow::Result; +use serde::Deserialize; + +use crate::config::RuntimeConfig; + +// This code is inspired by the Trunk crate (https://github.com/thedodd/trunk) + +// This file parses the options that can be declared in the environment. +// runtime.rs applies business logic and builds RuntimeConfig structs. + +/// Base configuration options +#[derive(Clone, Default, Deserialize)] +pub struct ConfigOptsBase { + /// This node's private IP address [default: None] + pub private_ip: Option<String>, + /// Expiration time for IGD rules [default: 60] + pub expiration_time: Option<u16>, + /// Refresh time for IGD and Firewall rules [default: 300] + pub refresh_time: Option<u16>, +} + +/// ACME configuration options +#[derive(Clone, Default, Deserialize)] +pub struct ConfigOptsAcme { + /// Whether ACME is enabled [default: false] + #[serde(default)] + pub enable: bool, + + /// The default domain holder's e-mail [default: None] + pub email: Option<String>, +} + +/// Consul configuration options +#[derive(Clone, Default, Deserialize)] +pub struct ConfigOptsConsul { + /// Consul's node name [default: None] + pub node_name: Option<String>, + /// Consul's REST URL [default: "http://127.0.0.1:8500"] + pub url: Option<String>, +} + +/// Model of all potential configuration options +pub struct ConfigOpts { + pub base: ConfigOptsBase, + pub acme: ConfigOptsAcme, + pub consul: ConfigOptsConsul, +} + +impl ConfigOpts { + pub fn from_env() -> Result<RuntimeConfig> { + let base: ConfigOptsBase = envy::prefixed("DIPLONAT_").from_env()?; + let consul: ConfigOptsConsul = envy::prefixed("DIPLONAT_CONSUL_").from_env()?; + let acme: ConfigOptsAcme = envy::prefixed("DIPLONAT_ACME_").from_env()?; + + RuntimeConfig::new(Self { + base: base, + consul: consul, + acme: acme, + }) + } + + // Currently only used in tests + #[allow(dead_code)] + pub fn from_iter<Iter: Clone>(iter: Iter) -> Result<RuntimeConfig> + where Iter: IntoIterator<Item = (String, String)> { + let base: ConfigOptsBase = envy::prefixed("DIPLONAT_").from_iter(iter.clone())?; + let consul: ConfigOptsConsul = envy::prefixed("DIPLONAT_CONSUL_").from_iter(iter.clone())?; + let acme: ConfigOptsAcme = envy::prefixed("DIPLONAT_ACME_").from_iter(iter.clone())?; + + RuntimeConfig::new(Self { + base: base, + consul: consul, + acme: acme, + }) + } +}
\ No newline at end of file |