mirror of
https://github.com/mbierlee/mirage-config.git
synced 2024-11-15 04:44:01 +01:00
Add ability to disable env var substitution
This commit is contained in:
parent
8389d75958
commit
84220739d8
|
@ -17,6 +17,7 @@ import std.conv : to, ConvException;
|
||||||
import std.file : readText;
|
import std.file : readText;
|
||||||
import std.path : extension;
|
import std.path : extension;
|
||||||
import std.process : environment;
|
import std.process : environment;
|
||||||
|
import std.typecons : Flag;
|
||||||
|
|
||||||
import mirage.json : loadJsonConfig;
|
import mirage.json : loadJsonConfig;
|
||||||
|
|
||||||
|
@ -211,17 +212,28 @@ private class ConfigPath {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used in a ConfigDictionary to enable to disable environment variable substitution.
|
||||||
|
*/
|
||||||
|
alias SubstituteEnvironmentVariables = Flag!"substituteEnvironmentVariables";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A ConfigDictionary contains the configuration tree and facilities to get values from that tree.
|
* A ConfigDictionary contains the configuration tree and facilities to get values from that tree.
|
||||||
*/
|
*/
|
||||||
class ConfigDictionary {
|
class ConfigDictionary {
|
||||||
ConfigNode rootNode;
|
ConfigNode rootNode;
|
||||||
|
SubstituteEnvironmentVariables substituteEnvironmentVariables = SubstituteEnvironmentVariables
|
||||||
|
.yes;
|
||||||
|
|
||||||
this() {
|
this(SubstituteEnvironmentVariables substituteEnvironmentVariables = SubstituteEnvironmentVariables
|
||||||
|
.yes) {
|
||||||
|
this.substituteEnvironmentVariables = substituteEnvironmentVariables;
|
||||||
}
|
}
|
||||||
|
|
||||||
this(ConfigNode rootNode) {
|
this(ConfigNode rootNode, SubstituteEnvironmentVariables substituteEnvironmentVariables = SubstituteEnvironmentVariables
|
||||||
|
.yes) {
|
||||||
this.rootNode = rootNode;
|
this.rootNode = rootNode;
|
||||||
|
this.substituteEnvironmentVariables = substituteEnvironmentVariables;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -242,7 +254,7 @@ class ConfigDictionary {
|
||||||
auto node = getNodeAt(path);
|
auto node = getNodeAt(path);
|
||||||
auto value = cast(ValueNode) node;
|
auto value = cast(ValueNode) node;
|
||||||
if (value) {
|
if (value) {
|
||||||
return substituteEnvVars(value);
|
return substituteEnvironmentVariables ? substituteEnvVars(value) : value.value;
|
||||||
} else {
|
} else {
|
||||||
throw new ConfigReadException(
|
throw new ConfigReadException(
|
||||||
"Value expected but " ~ node.nodeType ~ " found at path: " ~ createExceptionPath(
|
"Value expected but " ~ node.nodeType ~ " found at path: " ~ createExceptionPath(
|
||||||
|
@ -746,4 +758,39 @@ version (unittest) {
|
||||||
assert(config.get("megaMix") == "is ready! is set! go!");
|
assert(config.get("megaMix") == "is ready! is set! go!");
|
||||||
assert(config.get("typical") == "localhost:8080");
|
assert(config.get("typical") == "localhost:8080");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@("Don't read value from environment variables when disabled")
|
||||||
|
unittest {
|
||||||
|
environment.remove("MIRAGE_CONFIG_TEST_ENV_VAR");
|
||||||
|
environment.remove("MIRAGE_CONFIG_TEST_ENV_VAR_TWO");
|
||||||
|
|
||||||
|
auto config = new ConfigDictionary(
|
||||||
|
new ObjectNode(
|
||||||
|
[
|
||||||
|
"withBrackets": new ValueNode("${MIRAGE_CONFIG_TEST_ENV_VAR}"),
|
||||||
|
"withoutBrackets": new ValueNode("$MIRAGE_CONFIG_TEST_ENV_VAR"),
|
||||||
|
"withWhiteSpace": new ValueNode(" ${MIRAGE_CONFIG_TEST_ENV_VAR} "),
|
||||||
|
"alsoWithWhiteSpace": new ValueNode(" $MIRAGE_CONFIG_TEST_ENV_VAR"),
|
||||||
|
"tooMuchWhiteSpace": new ValueNode("$MIRAGE_CONFIG_TEST_ENV_VAR "),
|
||||||
|
"notSet": new ValueNode("${MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR}"),
|
||||||
|
"withDefault": new ValueNode("$MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR:use default!"),
|
||||||
|
"withDefaultAndBrackets": new ValueNode(
|
||||||
|
"${MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR:use default!}"),
|
||||||
|
"megaMix": new ValueNode("${MIRAGE_CONFIG_TEST_ENV_VAR_TWO} ${MIRAGE_CONFIG_TEST_ENV_VAR} ${MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR:go}!"),
|
||||||
|
"typical": new ValueNode("${MIRAGE_CONFIG_TEST_HOSTNAME:localhost}:${MIRAGE_CONFIG_TEST_PORT:8080}"),
|
||||||
|
]),
|
||||||
|
SubstituteEnvironmentVariables.no
|
||||||
|
);
|
||||||
|
|
||||||
|
assert(config.get("withBrackets") == "${MIRAGE_CONFIG_TEST_ENV_VAR}");
|
||||||
|
assert(config.get("withoutBrackets") == "$MIRAGE_CONFIG_TEST_ENV_VAR");
|
||||||
|
assert(config.get("withWhiteSpace") == " ${MIRAGE_CONFIG_TEST_ENV_VAR} ");
|
||||||
|
assert(config.get("alsoWithWhiteSpace") == " $MIRAGE_CONFIG_TEST_ENV_VAR");
|
||||||
|
assert(config.get("tooMuchWhiteSpace") == "$MIRAGE_CONFIG_TEST_ENV_VAR ");
|
||||||
|
assert(config.get("notSet") == "${MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR}");
|
||||||
|
assert(config.get("withDefault") == "$MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR:use default!");
|
||||||
|
assert(config.get("withDefaultAndBrackets") == "${MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR:use default!}");
|
||||||
|
assert(config.get("megaMix") == "${MIRAGE_CONFIG_TEST_ENV_VAR_TWO} ${MIRAGE_CONFIG_TEST_ENV_VAR} ${MIRAGE_CONFIG_NOT_SET_TEST_ENV_VAR:go}!");
|
||||||
|
assert(config.get("typical") == "${MIRAGE_CONFIG_TEST_HOSTNAME:localhost}:${MIRAGE_CONFIG_TEST_PORT:8080}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue