diff --git a/README.md b/README.md index d929c15..1238fe3 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,10 @@ public T Get(string variableName, bool raiseException = false); public string GetRequired(string variableName); public object GetRequired(Type type, string variableName); public T GetRequired(string variableName); + +public string GetOrDefault(string variableName, string defaultValue); +public object GetOrDefault(Type type, string variableName, object defaultValue); +public T GetOrDefault(string variableName, T defaultValue); ``` **Example: Basic Usage** @@ -63,6 +67,10 @@ public static T Get(string variableName, bool raiseException = false); public static string GetRequired(string variableName); public static object GetRequired(Type type, string variableName); public static T GetRequired(string variableName); + +public static string GetOrDefault(string variableName, string defaultValue); +public static object GetOrDefault(Type type, string variableName, object defaultValue); +public static T GetOrDefault(string variableName, T defaultValue); ``` **Example: Static Usage** @@ -91,6 +99,10 @@ public static string Get(this Enum key, IEnvManager? envManager = null); public static object Get(this Enum key, Type type, IEnvManager? envManager = null); public static T Get(this Enum key, IEnvManager? envManager = null); +public static string GetRequired(this Enum key, IEnvManager? envManager = null); +public static object GetRequired(this Enum key, Type type, IEnvManager? envManager = null); +public static T GetRequired(this Enum key, IEnvManager? envManager = null); + public static string GetRequired(this Enum key, IEnvManager? envManager = null); public static object GetRequired(this Enum key, Type type, IEnvManager? envManager = null); public static T GetRequired(this Enum key, IEnvManager? envManager = null); diff --git a/src/EnvironmentManager/Core/EnvManager.cs b/src/EnvironmentManager/Core/EnvManager.cs index 2d080e1..53130a8 100644 --- a/src/EnvironmentManager/Core/EnvManager.cs +++ b/src/EnvironmentManager/Core/EnvManager.cs @@ -1,5 +1,6 @@ using System; using AutoMapper; +using System.Collections.Generic; using Microsoft.Extensions.Logging; using EnvironmentManager.Configuration; using Microsoft.Extensions.Logging.Abstractions; @@ -45,6 +46,25 @@ public T Get(string variableName, bool raiseException = false) return GetInternal(typeof(T), variableName, raiseException); } + /// + public string GetOrDefault(string variableName, string defaultValue) + { + return GetInternal(typeof(string), variableName, false) ?? defaultValue; + } + + /// + public object GetOrDefault(Type type, string variableName, object defaultValue) + { + return GetInternal(type, variableName, false) ?? defaultValue; + } + + /// + public T GetOrDefault(string variableName, T defaultValue) + { + var value = GetInternal(typeof(T), variableName, false); + return value == null || EqualityComparer.Default.Equals(value, default!) ? defaultValue : value; + } + /// public string GetRequired(string variableName) { diff --git a/src/EnvironmentManager/Core/IEnvManager.cs b/src/EnvironmentManager/Core/IEnvManager.cs index db8b938..2423768 100644 --- a/src/EnvironmentManager/Core/IEnvManager.cs +++ b/src/EnvironmentManager/Core/IEnvManager.cs @@ -45,6 +45,35 @@ public interface IEnvManager /// An object of type , or the value of if the variable is not found and is . public T Get(string variableName, bool raiseException = false); + /// + /// Retrieves the environment variable with the specified ; + /// if the variable is missing, empty, or equals its intrinsic value, returns the supplied instead. + /// + /// The name of the environment variable to retrieve. + /// The fallback value to return when the variable is not found or cannot be converted. + /// The environment-variable value as a , or the provided when the variable is not present or invalid. + public string GetOrDefault(string variableName, string defaultValue); + + /// + /// Retrieves the environment variable with the specified and converts it to the specified ; + /// if the variable is missing or cannot be converted, returns the supplied . + /// + /// The target to which the environment variable should be converted. + /// The name of the environment variable to retrieve. + /// The fallback value to return when the variable is not found or conversion fails. + /// An object of the specified , or the provided when the variable is not present or cannot be converted. + public object GetOrDefault(Type type, string variableName, object defaultValue); + + /// + /// Retrieves the environment variable with the specified and converts it to the specified type ; + /// if the variable is missing or cannot be converted, returns the supplied . + /// + /// The target type to which the environment variable should be converted. + /// The name of the environment variable to retrieve. + /// The fallback value to return when the variable is not found or conversion fails. + /// An object of type , or the provided when the variable is not present or cannot be converted. + public T GetOrDefault(string variableName, T defaultValue); + /// /// Retrieves the required environment variable with the specified .
/// Throws an exception if the environment variable is not found. diff --git a/src/EnvironmentManager/Extensions/EnumExtensions.cs b/src/EnvironmentManager/Extensions/EnumExtensions.cs index a38343b..54a295c 100644 --- a/src/EnvironmentManager/Extensions/EnumExtensions.cs +++ b/src/EnvironmentManager/Extensions/EnumExtensions.cs @@ -62,6 +62,59 @@ public static T Get(this Enum key, IEnvManager? envManager = null) return manager.Get(key.ToString(), attribute?.IsRequired ?? false); } + /// + /// Retrieves the environment variable associated with the given enum value and converts it to the type; + /// if the variable is missing or empty, returns the supplied . + /// + /// The enum value representing the environment variable. + /// The fallback value to return when the variable is not found or its value is / empty. + /// The to use for retrieving the environment variable. If , the static will be used. + /// The environment-variable value as a , or the provided when the variable is not present or invalid. + /// The flag is ignored: the variable is always treated as optional, because a default value is supplied. + public static string GetOrDefault(this Enum key, string defaultValue, IEnvManager? envManager = null) + { + var manager = GetEnvManager(envManager); + return manager.GetOrDefault(key.ToString(), defaultValue); + } + + /// + /// Retrieves the environment variable associated with the given enum value and converts it to the specified ; + /// if the variable is missing or cannot be converted, returns the supplied . + /// + /// The enum value representing the environment variable. + /// The target for conversion. + /// The fallback value to return when the variable is not found or conversion fails. + /// The to use for retrieving the environment variable. If , the static will be used. + /// An object of the specified , or the provided when the variable is not present or cannot be converted. + /// + /// The applied to the enum field (if any) is ignored in favour of the explicit parameter. + /// is ignored because a default value is available. + /// + public static object GetOrDefault(this Enum key, Type type, object defaultValue, IEnvManager? envManager = null) + { + var manager = GetEnvManager(envManager); + return manager.GetOrDefault(type, key.ToString(), defaultValue); + } + + /// + /// Retrieves the environment variable associated with the given enum value and converts it to the specified type ; + /// if the variable is missing or cannot be converted, returns the supplied . + /// + /// The target type for conversion. + /// The enum value representing the environment variable. + /// The fallback value to return when the variable is not found or conversion fails. + /// The to use for retrieving the environment variable. If , the static will be used. + /// An object of type , or the provided when the variable is not present or cannot be converted. + /// + /// The applied to the enum field (if any) is ignored in favour of the generic type . + /// is ignored because a default value is supplied. + /// + public static T GetOrDefault(this Enum key, T defaultValue, IEnvManager? envManager = null) + { + var manager = GetEnvManager(envManager); + return manager.GetOrDefault(key.ToString(), defaultValue); + } + /// /// Retrieves the required environment variable associated with the given enum value, converted to the type.
/// Throws an exception if the variable is not found. diff --git a/src/EnvironmentManager/Static/EnvManager.cs b/src/EnvironmentManager/Static/EnvManager.cs index 1e7156f..027356b 100644 --- a/src/EnvironmentManager/Static/EnvManager.cs +++ b/src/EnvironmentManager/Static/EnvManager.cs @@ -52,6 +52,24 @@ public static T Get(string variableName, bool raiseException = false) return Manager.Get(variableName, raiseException); } + /// + public static string GetOrDefault(string variableName, string defaultValue) + { + return Manager.GetOrDefault(variableName, defaultValue); + } + + /// + public static object GetOrDefault(Type type, string variableName, object defaultValue) + { + return Manager.GetOrDefault(type, variableName, defaultValue); + } + + /// + public static T GetOrDefault(string variableName, T defaultValue) + { + return Manager.GetOrDefault(variableName, defaultValue); + } + /// public static string GetRequired(string variableName) { diff --git a/test/EnvironmentManager.Tests/Core/EnvManagerTests.cs b/test/EnvironmentManager.Tests/Core/EnvManagerTests.cs index 0a810a2..ab2fcae 100644 --- a/test/EnvironmentManager.Tests/Core/EnvManagerTests.cs +++ b/test/EnvironmentManager.Tests/Core/EnvManagerTests.cs @@ -7,6 +7,7 @@ using EnvironmentManager.Configuration; using EnvironmentManager.Tests.TestHelpers; using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.VisualStudio.TestPlatform.Utilities; namespace EnvironmentManager.Tests.Core; @@ -85,6 +86,89 @@ public void WhenValidValue_ShouldReturnConvertedValue(string stored, TO } } + public class GetOrDefault_String : TestData + { + private readonly string _defaultValue = "Bye World!"; + + [Fact] + public void WhenValidValue_ShouldReturnConvertedValue() + { + var stored = "Hello World!"; + var variableName = NameOfVariable(); + Environment.SetEnvironmentVariable(variableName, stored); + + var result = EnvironmentManager.GetOrDefault(variableName, _defaultValue); + + result.Should().BeEquivalentTo(stored); + } + + [Fact] + public void WhenNotFoundValue_ShouldReturnDefaultValue() + { + var variableName = NameOfVariable(); + + var result = EnvironmentManager.GetOrDefault(variableName, _defaultValue); + + result.Should().BeEquivalentTo(_defaultValue); + } + } + + public class GetOrDefault_Typed : TestData + { + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenValidValue_ShouldReturnConvertedValue(string stored, TOutput expected) + { + var variableName = NameOfVariable(); + Environment.SetEnvironmentVariable(variableName, stored); + + var result = EnvironmentManager.GetOrDefault(typeof(TOutput), variableName, null!); + + result.Should().BeEquivalentTo(expected); + } + + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenNotFoundValue_ShouldReturnDefaultValue(string _, TOutput defaultValue) + { + var variableName = NameOfVariable(); + + var result = EnvironmentManager.GetOrDefault(typeof(TOutput), variableName, defaultValue!); + + result.Should().BeEquivalentTo(defaultValue); + } + } + + public class GetOrDefault_Generic : TestData + { + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenValidValue_ShouldReturnConvertedValue(string stored, TOutput expected) + { + var variableName = NameOfVariable(); + Environment.SetEnvironmentVariable(variableName, stored); + + var result = EnvironmentManager.GetOrDefault(variableName, default!); + + result.Should().BeEquivalentTo(expected); + } + + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenNotFoundValue_ShouldReturnDefaultValue(string _, TOutput defaultValue) + { + var variableName = NameOfVariable(); + + var result = EnvironmentManager.GetOrDefault(variableName, defaultValue!); + + result.Should().BeEquivalentTo(defaultValue); + } + } + public class GetRequired_String : TestData { [Fact] diff --git a/test/EnvironmentManager.Tests/Extensions/EnumExtensionsTests.cs b/test/EnvironmentManager.Tests/Extensions/EnumExtensionsTests.cs index a946583..0490df1 100644 --- a/test/EnvironmentManager.Tests/Extensions/EnumExtensionsTests.cs +++ b/test/EnvironmentManager.Tests/Extensions/EnumExtensionsTests.cs @@ -51,6 +51,86 @@ public void WhenValidValue_ShouldReturnConvertedValue(Enum enumMember, } } + public class GetOrDefault_String : TestData + { + private readonly string _defaultValue = "Bye World!"; + + [Fact] + public void WhenValidValue_ShouldReturnConvertedValue() + { + var stored = "Hello World!"; + Environment.SetEnvironmentVariable(TestEnum.STRING.ToString(), stored); + + var result = TestEnum.STRING.GetOrDefault(_defaultValue, EnvironmentManager); + + result.Should().BeEquivalentTo(stored); + } + + [Fact] + public void WhenNotFoundValue_ShouldReturnDefaultValue() + { + Environment.SetEnvironmentVariable(TestEnum.STRING.ToString(), null); + + var result = TestEnum.STRING.GetOrDefault(_defaultValue, EnvironmentManager); + + result.Should().BeEquivalentTo(_defaultValue); + } + } + + public class GetOrDefault_Typed : TestData + { + [Theory] + [MemberData(nameof(EnumTestData))] + [MemberData(nameof(ImplementedEnumTestData))] + public void WhenValidValue_ShouldReturnConvertedValue(Enum enumMember, string stored, TOutput expected) + { + Environment.SetEnvironmentVariable(enumMember.ToString(), stored); + + var result = enumMember.GetOrDefault(typeof(TOutput), null!, EnvironmentManager); + + result.Should().BeEquivalentTo(expected); + } + + [Theory] + [MemberData(nameof(EnumTestData))] + [MemberData(nameof(ImplementedEnumTestData))] + public void WhenNotFoundValue_ShouldReturnDefaultValue(Enum enumMember, string _, TOutput defaultValue) + { + Environment.SetEnvironmentVariable(enumMember.ToString(), null); + + var result = enumMember.GetOrDefault(typeof(TOutput), defaultValue!, EnvironmentManager); + + result.Should().BeEquivalentTo(defaultValue); + } + } + + public class GetOrDefault_Generic : TestData + { + [Theory] + [MemberData(nameof(EnumTestData))] + [MemberData(nameof(ImplementedEnumTestData))] + public void WhenValidValue_ShouldReturnConvertedValue(Enum enumMember, string stored, TOutput expected) + { + Environment.SetEnvironmentVariable(enumMember.ToString(), stored); + + var result = enumMember.GetOrDefault(default!, EnvironmentManager); + + result.Should().BeEquivalentTo(expected); + } + + [Theory] + [MemberData(nameof(EnumTestData))] + [MemberData(nameof(ImplementedEnumTestData))] + public void WhenNotFoundValue_ShouldReturnDefaultValue(Enum enumMember, string _, TOutput defaultValue) + { + Environment.SetEnvironmentVariable(enumMember.ToString(), null); + + var result = enumMember.GetOrDefault(typeof(TOutput), defaultValue!, EnvironmentManager); + + result.Should().BeEquivalentTo(defaultValue); + } + } + public class GetRequired_String : TestData { [Fact] diff --git a/test/EnvironmentManager.Tests/Properties/AssemblyInfo.cs b/test/EnvironmentManager.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3c36036 --- /dev/null +++ b/test/EnvironmentManager.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using Xunit; + +[assembly: CollectionBehavior(DisableTestParallelization = true, MaxParallelThreads = 1)] \ No newline at end of file diff --git a/test/EnvironmentManager.Tests/Static/EnvManagerStaticTests.cs b/test/EnvironmentManager.Tests/Static/EnvManagerStaticTests.cs index 2b2f1f0..eb5ea51 100644 --- a/test/EnvironmentManager.Tests/Static/EnvManagerStaticTests.cs +++ b/test/EnvironmentManager.Tests/Static/EnvManagerStaticTests.cs @@ -58,6 +58,96 @@ public void WhenValidValue_ShouldReturnConvertedValue(string stored, TO } } + public class GetOrDefault_String : TestData + { + private readonly string _defaultValue = "Bye World!"; + + [Fact] + public void WhenValidValue_ShouldReturnConvertedValue() + { + var stored = "Hello World!"; + var variableName = NameOfVariable(); + Environment.SetEnvironmentVariable(variableName, stored); + EnvManager.Initialize(MapperConfiguration); + + var result = EnvManager.GetOrDefault(variableName, _defaultValue); + + result.Should().BeEquivalentTo(stored); + } + + [Fact] + public void WhenNotFoundValue_ShouldReturnDefaultValue() + { + var defaultValue = "Bye World!"; + var variableName = NameOfVariable(); + EnvManager.Initialize(MapperConfiguration); + + var result = EnvManager.GetOrDefault(variableName, _defaultValue); + + result.Should().BeEquivalentTo(_defaultValue); + } + } + + public class GetOrDefault_Typed : TestData + { + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenValidValue_ShouldReturnConvertedValue(string stored, TOutput expected) + { + var variableName = NameOfVariable(); + Environment.SetEnvironmentVariable(variableName, stored); + EnvManager.Initialize(MapperConfiguration); + + var result = EnvManager.GetOrDefault(typeof(TOutput), variableName, null!); + + result.Should().BeEquivalentTo(expected); + } + + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenNotFoundValue_ShouldReturnDefaultValue(string _, TOutput defaultValue) + { + var variableName = NameOfVariable(); + EnvManager.Initialize(MapperConfiguration); + + var result = EnvManager.GetOrDefault(typeof(TOutput), variableName, defaultValue!); + + result.Should().BeEquivalentTo(defaultValue); + } + } + + public class GetOrDefault_Generic : TestData + { + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenValidValue_ShouldReturnConvertedValue(string stored, TOutput expected) + { + var variableName = NameOfVariable(); + Environment.SetEnvironmentVariable(variableName, stored); + EnvManager.Initialize(MapperConfiguration); + + var result = EnvManager.GetOrDefault(variableName, default!); + + result.Should().BeEquivalentTo(expected); + } + + [Theory] + [MemberData(nameof(CommonTestData))] + [MemberData(nameof(ImplementedTestData))] + public void WhenNotFoundValue_ShouldReturnDefaultValue(string _, TOutput defaultValue) + { + var variableName = NameOfVariable(); + EnvManager.Initialize(MapperConfiguration); + + var result = EnvManager.GetOrDefault(variableName, defaultValue!); + + result.Should().BeEquivalentTo(defaultValue); + } + } + public class GetRequired_String : TestData { [Fact]