aboutsummaryrefslogtreecommitdiff
path: root/src/config/options.rs
blob: 36da475bd2dda5ac8cf03f8ad8ab351d60e255d7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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,
		})
	}
}