Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions ConfigurationSubstitution.Tests/ConfigurationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,5 +121,39 @@ public void Should_get_non_substituted_value_as_is()

substituted.Should().Be("Boyz n the hood");
}

[Fact]
public void Should_throw_for_non_resolved_variable()
{
var configurationBuilder = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
{ "TestKey", "Test value {Foobar}" }
})
.EnableSubstitutions();

var configuration = configurationBuilder.Build();

// Act
Action act = () => _ = configuration["TestKey"];

act.Should().Throw<UndefinedConfigVariableException>().WithMessage("*variable*{Foobar}*");
}

[Fact]
public void Should_ignore_non_resolved_variable()
{
var configurationBuilder = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
{ "TestKey", "Test value {Foobar}" }
})
.EnableSubstitutions(exceptionOnMissingVariables: false);

var configuration = configurationBuilder.Build();

var value = configuration["TestKey"];
value.Should().Be("Test value ");
}
}
}
2 changes: 1 addition & 1 deletion ConfigurationSubstitutor/ConfigurationSubstitution.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<RepositoryType>GitHub</RepositoryType>
<PackageProjectUrl>https://github.com/molinch/ConfigurationSubstitutor</PackageProjectUrl>
<PackageTags>netcore options configuration substitute substitution substituted variable aspnet</PackageTags>
<Version>1.0.2</Version>
<Version>1.1.0</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
15 changes: 12 additions & 3 deletions ConfigurationSubstitutor/ConfigurationSubstitutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@ public class ConfigurationSubstitutor
private readonly string _startsWith;
private readonly string _endsWith;
private Regex _findSubstitutions;
private readonly bool _exceptionOnMissingVariables;

public ConfigurationSubstitutor() : this("{", "}")
public ConfigurationSubstitutor(bool exceptionOnMissingVariables = true) : this("{", "}", exceptionOnMissingVariables)
{
}

public ConfigurationSubstitutor(string substitutableStartsWith, string substitutableEndsWith)
public ConfigurationSubstitutor(string substitutableStartsWith, string substitutableEndsWith, bool exceptionOnMissingVariables = true)
{
_startsWith = substitutableStartsWith;
_endsWith = substitutableEndsWith;
_findSubstitutions = new Regex(@"(?<=" + Regex.Escape(_startsWith) + @")[^}{]*(?="+ Regex.Escape(_endsWith) + @")", RegexOptions.Compiled);
_exceptionOnMissingVariables = exceptionOnMissingVariables;
}

public string GetSubstituted(IConfiguration configuration, string key)
Expand All @@ -34,7 +36,14 @@ public string ApplySubstitution(IConfiguration configuration, string value)
var captures = _findSubstitutions.Matches(value).Cast<Match>().SelectMany(m => m.Captures.Cast<Capture>());
foreach (var capture in captures)
{
value = value.Replace(_startsWith + capture.Value + _endsWith, configuration[capture.Value]);
var substitutedValue = configuration[capture.Value];

if (substitutedValue == null && _exceptionOnMissingVariables)
{
throw new UndefinedConfigVariableException($"{_startsWith}{capture.Value}{_endsWith}");
}

value = value.Replace(_startsWith + capture.Value + _endsWith, substitutedValue);
}
return value;
}
Expand Down
8 changes: 4 additions & 4 deletions ConfigurationSubstitutor/IConfigurationBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ namespace ConfigurationSubstitution
{
public static class IConfigurationBuilderExtensions
{
public static IConfigurationBuilder EnableSubstitutions(this IConfigurationBuilder builder)
public static IConfigurationBuilder EnableSubstitutions(this IConfigurationBuilder builder, bool exceptionOnMissingVariables = true)
{
return EnableSubstitutions(builder, new ConfigurationSubstitutor());
return EnableSubstitutions(builder, new ConfigurationSubstitutor(exceptionOnMissingVariables));
}

public static IConfigurationBuilder EnableSubstitutions(this IConfigurationBuilder builder, string substitutableStartsWith, string substitutableEndsWith)
public static IConfigurationBuilder EnableSubstitutions(this IConfigurationBuilder builder, string substitutableStartsWith, string substitutableEndsWith, bool exceptionOnMissingVariables = true)
{
return EnableSubstitutions(builder, new ConfigurationSubstitutor(substitutableStartsWith, substitutableEndsWith));
return EnableSubstitutions(builder, new ConfigurationSubstitutor(substitutableStartsWith, substitutableEndsWith, exceptionOnMissingVariables));
}

private static IConfigurationBuilder EnableSubstitutions(this IConfigurationBuilder builder, ConfigurationSubstitutor substitutor)
Expand Down
12 changes: 12 additions & 0 deletions ConfigurationSubstitutor/UndefinedConfigVariableException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace ConfigurationSubstitution
{
using System;

public class UndefinedConfigVariableException : Exception
{
public UndefinedConfigVariableException(string variableName)
: base($"No value found for configuration variable {variableName}")
{
}
}
}