diff options
Diffstat (limited to 'src/config/options.rs')
-rw-r--r-- | src/config/options.rs | 78 |
1 files changed, 53 insertions, 25 deletions
diff --git a/src/config/options.rs b/src/config/options.rs index 36da475..b3a63b0 100644 --- a/src/config/options.rs +++ b/src/config/options.rs @@ -8,21 +8,27 @@ use crate::config::RuntimeConfig; // This file parses the options that can be declared in the environment. // runtime.rs applies business logic and builds RuntimeConfig structs. -/// Base configuration options +// - Note for the future - +// There is no *need* to have a 'DIPLONAT_XXX_*' prefix for all config options. +// If some config options are shared by several modules, a ConfigOptsBase could +// contain them, and parse the 'DIPLONAT_*' prefix directly. +// Only in runtime.rs would these options find their proper location in each +// module's struct. + + +/// Consul 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>, +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>, } /// ACME configuration options #[derive(Clone, Default, Deserialize)] pub struct ConfigOptsAcme { - /// Whether ACME is enabled [default: false] + /// Whether the ACME module is enabled [default: false] #[serde(default)] pub enable: bool, @@ -30,32 +36,52 @@ pub struct ConfigOptsAcme { pub email: Option<String>, } -/// Consul configuration options +/// Firewall 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>, +pub struct ConfigOptsFirewall { + /// Whether the firewall module is enabled [default: false] + #[serde(default)] + pub enable: bool, + + /// Refresh time for firewall rules [default: 300] + pub refresh_time: Option<u16>, +} + +/// IGD configuration options +#[derive(Clone, Default, Deserialize)] +pub struct ConfigOptsIgd { + /// Whether the IGD module is enabled [default: false] + #[serde(default)] + pub enable: bool, + + /// 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 rules [default: 300] + pub refresh_time: Option<u16>, } /// Model of all potential configuration options pub struct ConfigOpts { - pub base: ConfigOptsBase, - pub acme: ConfigOptsAcme, pub consul: ConfigOptsConsul, + pub acme: ConfigOptsAcme, + pub firewall: ConfigOptsFirewall, + pub igd: ConfigOptsIgd, } 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()?; + let firewall: ConfigOptsFirewall = envy::prefixed("DIPLONAT_FIREWALL_").from_env()?; + let igd: ConfigOptsIgd = envy::prefixed("DIPLONAT_IGD_").from_env()?; RuntimeConfig::new(Self { - base: base, - consul: consul, - acme: acme, + consul, + acme, + firewall, + igd, }) } @@ -63,14 +89,16 @@ impl ConfigOpts { #[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())?; + let firewall: ConfigOptsFirewall = envy::prefixed("DIPLONAT_FIREWALL_").from_iter(iter.clone())?; + let igd: ConfigOptsIgd = envy::prefixed("DIPLONAT_IGD_").from_iter(iter.clone())?; RuntimeConfig::new(Self { - base: base, - consul: consul, - acme: acme, + consul, + acme, + firewall, + igd, }) } }
\ No newline at end of file |