diff --git a/src/NetLah.Extensions.Configuration/AddFileConfigurationSourceOptions.cs b/src/NetLah.Extensions.Configuration/AddFileConfigurationSourceOptions.cs index eea06fd..f292dcc 100644 --- a/src/NetLah.Extensions.Configuration/AddFileConfigurationSourceOptions.cs +++ b/src/NetLah.Extensions.Configuration/AddFileConfigurationSourceOptions.cs @@ -22,7 +22,7 @@ public class AddFileConfigurationSourceOptions : IConfigureAddFiles { public IDictionary ConfigureAddFiles { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - public List> Handlers { get; } = new List>(); + public List> Handlers { get; } = []; public string SectionKey { get; set; } = string.Empty; diff --git a/src/NetLah.Extensions.Configuration/CertificateConfig.cs b/src/NetLah.Extensions.Configuration/CertificateConfig.cs index 4281421..d871d90 100644 --- a/src/NetLah.Extensions.Configuration/CertificateConfig.cs +++ b/src/NetLah.Extensions.Configuration/CertificateConfig.cs @@ -2,12 +2,12 @@ namespace NetLah.Extensions.Configuration; -#pragma warning disable S125 // Sections of code should not be commented out +//#pragma warning disable S125 // Sections of code should not be commented out // "Certificate": { // "Path": "testCert.pfx" // "Password": "testPassword" // } -#pragma warning restore S125 // Sections of code should not be commented out +//#pragma warning restore S125 // Sections of code should not be commented out public class CertificateConfig { @@ -42,11 +42,6 @@ public class CertificateConfig public override string? ToString() { - if (IsFileCert) - { - return Path; - } - - return IsStoreThumbprint ? Thumbprint : Subject; + return IsFileCert ? Path : IsStoreThumbprint ? Thumbprint : Subject; } } diff --git a/src/NetLah.Extensions.Configuration/CertificateLoader.cs b/src/NetLah.Extensions.Configuration/CertificateLoader.cs index 209c734..7310a1e 100644 --- a/src/NetLah.Extensions.Configuration/CertificateLoader.cs +++ b/src/NetLah.Extensions.Configuration/CertificateLoader.cs @@ -25,13 +25,11 @@ public static class CertificateLoader { var isMacOs = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); -#pragma warning disable S3358 // Ternary operators should not be nested var keyStorageFlag = !requiredPrivateKey || isMacOs ? X509KeyStorageFlags.DefaultKeySet : certInfo.KeyStorageFlags is { } keyStorageFlags ? (X509KeyStorageFlags)((int)keyStorageFlags & 63) : X509KeyStorageFlags.Exportable | X509KeyStorageFlags.EphemeralKeySet; -#pragma warning restore S3358 // Ternary operators should not be nested var cert = new X509Certificate2(certInfo.Path, certInfo.Password, keyStorageFlag); @@ -64,7 +62,7 @@ public static class CertificateLoader var storeLocation = StoreLocation.CurrentUser; if (!string.IsNullOrEmpty(location)) { - storeLocation = (StoreLocation)Enum.Parse(typeof(StoreLocation), location, ignoreCase: true); + storeLocation = Enum.Parse(location, ignoreCase: true); } var allowInvalid = certInfo.AllowInvalid ?? true; // default is allow invalid @@ -122,7 +120,6 @@ internal static bool IsCertificateAllowedFor(X509Certificate2 certificate, strin foreach (var extension in certificate.Extensions.OfType()) { hasEkuExtension = true; -#pragma warning disable S3267 // Loops should be simplified with "LINQ" expressions foreach (var oid in extension.EnhancedKeyUsages) { if (string.Equals(oid.Value, expectedOid, StringComparison.Ordinal)) @@ -130,7 +127,6 @@ internal static bool IsCertificateAllowedFor(X509Certificate2 certificate, strin return true; } } -#pragma warning restore S3267 // Loops should be simplified with "LINQ" expressions } return !hasEkuExtension; diff --git a/src/NetLah.Extensions.Configuration/ConfigurationBuilderBuilder.cs b/src/NetLah.Extensions.Configuration/ConfigurationBuilderBuilder.cs index 01d0a65..8bb0672 100644 --- a/src/NetLah.Extensions.Configuration/ConfigurationBuilderBuilder.cs +++ b/src/NetLah.Extensions.Configuration/ConfigurationBuilderBuilder.cs @@ -12,8 +12,8 @@ namespace NetLah.Extensions.Configuration; public sealed class ConfigurationBuilderBuilder { - private readonly List> _configureConfigActions = new(); - private readonly List> _configurePostConfigActions = new(); + private readonly List> _configureConfigActions = []; + private readonly List> _configurePostConfigActions = []; private string[]? _args; private Assembly? _assembly; private string? _basePath; @@ -35,10 +35,7 @@ private BuilderOrManager ConfigureBuilder() .AddEnvironmentVariables(prefix: "DOTNET_") .AddEnvironmentVariables(prefix: "ASPNETCORE_"); - if (_environmentName == null) - { - _environmentName = ((IConfigurationBuilder)configBuilder).Build()[HostDefaults.EnvironmentKey]; - } + _environmentName ??= ((IConfigurationBuilder)configBuilder).Build()[HostDefaults.EnvironmentKey]; if (!string.IsNullOrEmpty(_basePath)) { diff --git a/src/NetLah.Extensions.Configuration/ConfigurationBuilderExtensions.cs b/src/NetLah.Extensions.Configuration/ConfigurationBuilderExtensions.cs index 0fe9e81..694370e 100644 --- a/src/NetLah.Extensions.Configuration/ConfigurationBuilderExtensions.cs +++ b/src/NetLah.Extensions.Configuration/ConfigurationBuilderExtensions.cs @@ -60,7 +60,13 @@ internal static TConfigurationBuilder AddAddFileConfiguration> configuration, ProviderName? providerName, Func keyNormalizer) { +#if NET7_0_OR_GREATER + internal static readonly Regex QuoteTokenRegex = QuoteTokenGeneratedRegex(); + private static readonly Regex NameAndProviderRegex = NameAndProviderGeneratedRegex(); + + [GeneratedRegex("(?([$%])\\1)|[$%]{(?[a-zA-Z0-9_\\-\\s]{1,64})}|[$%]\\((?[a-zA-Z0-9_\\-\\s]{1,64})\\)|[$%]\\[(?[a-zA-Z0-9_\\-\\s]{1,64})\\]", RegexOptions.Compiled)] + private static partial Regex QuoteTokenGeneratedRegex(); + + + [GeneratedRegex("^(?.+)_(?[^_]+)$", RegexOptions.Compiled)] + private static partial Regex NameAndProviderGeneratedRegex(); +#else internal static readonly Regex QuoteTokenRegex = new("(?([$%])\\1)|[$%]{(?[a-zA-Z0-9_\\-\\s]{1,64})}|[$%]\\((?[a-zA-Z0-9_\\-\\s]{1,64})\\)|[$%]\\[(?[a-zA-Z0-9_\\-\\s]{1,64})\\]", RegexOptions.Compiled); private static readonly Regex NameAndProviderRegex = new("^(?.+)_(?[^_]+)$", RegexOptions.Compiled); +#endif + private static readonly StringComparer DefaultStringComparer = ProviderNameComparer.DefaultStringComparer; private static readonly StringComparison DefaultStringComparison = StringComparison.OrdinalIgnoreCase; - private readonly IEnumerable> _configuration; - private readonly ProviderName? _selection; - private readonly Func _keyNormalizer; - - public ConnectionStringParser(IEnumerable> configuration, ProviderName? providerName, Func keyNormalizer) - { - _configuration = configuration; - _selection = providerName; - _keyNormalizer = keyNormalizer; - } + private readonly IEnumerable> _configuration = configuration; + private readonly ProviderName? _selection = providerName; + private readonly Func _keyNormalizer = keyNormalizer; // https://github.com/dotnet/runtime/blob/main/src/libraries/Microsoft.Extensions.Configuration.EnvironmentVariables/src/EnvironmentVariablesConfigurationProvider.cs#L15-L18 internal static ProviderName ParseProviderName(string? providerName) => (providerName?.ToUpperInvariant()) switch @@ -51,14 +57,14 @@ internal IEnumerable ListConnections() .GroupBy(kv => kv.normalizedKey) .ToDictionary(g => g.Key, g => g.First(), DefaultStringComparer); - var normalizedkeys = lookup.Keys.OrderBy(k => k.Length).ToArray(); + var normalizedKeys = lookup.Keys.OrderBy(k => k.Length).ToArray(); var selectedProvider = _selection?.Provider; var selectedCustom = _selection?.Custom; var conns = new List(); - foreach (var key in normalizedkeys) + foreach (var key in normalizedKeys) { if (lookup.Remove(key, out var kv) && kv.value != null) { @@ -94,7 +100,9 @@ ProviderName Add(string connectionName, string? providerName) if (_selection == null || (selectedProvider == provider.Provider && (!isExactCustom || isSameCustom))) { if (isExactCustom && isSameCustom) + { customProviderName = selectedCustom; + } conns.Add(new ProviderConnectionString(connectionName, kv.value, provider.Provider, customProviderName)); } @@ -139,7 +147,7 @@ internal Dictionary ExpandValue(IEnumerable 0) { entry.ConnStr.Value = QuoteTokenRegex.Replace(entry.Raw, ExpandMatchEvaluator); } @@ -182,20 +190,13 @@ internal Entry NewEntry(ProviderConnectionString connStr) return new Entry(connStr, hasQuotes, tokens); } - internal class Entry + internal class Entry(ProviderConnectionString connStr, bool hasQuotes, HashSet tokens) { - public Entry(ProviderConnectionString connStr, bool hasQuotes, HashSet tokens) - { - ConnStr = connStr; - HasQuotes = hasQuotes; - Tokens = tokens; - } - public string Name => ConnStr.Name; // for easier to debug and usage public string Raw => ConnStr.Raw; // for easier to debug and usage - public ProviderConnectionString ConnStr { get; } - public bool HasQuotes { get; } - public HashSet Tokens { get; } + public ProviderConnectionString ConnStr { get; } = connStr; + public bool HasQuotes { get; } = hasQuotes; + public HashSet Tokens { get; } = tokens; public int Remaining { get; set; } } } diff --git a/src/NetLah.Extensions.Configuration/ConnectionStringsRoot.cs b/src/NetLah.Extensions.Configuration/ConnectionStringsRoot.cs index aef38d8..579ba23 100644 --- a/src/NetLah.Extensions.Configuration/ConnectionStringsRoot.cs +++ b/src/NetLah.Extensions.Configuration/ConnectionStringsRoot.cs @@ -2,37 +2,25 @@ namespace NetLah.Extensions.Configuration; -internal class ConnectionStringsRoot +internal class ConnectionStringsRoot(KeyValuePair[] configuration, + Func? keyNormalizer, + Func[], Func, ProviderName?, IDictionary>? factory = null) { - public ConnectionStringsRoot(KeyValuePair[] configuration, - Func? keyNormalizer, - Func[], Func, ProviderName?, IDictionary>? factory = null) - { - Configuration = configuration; - KeyNormalizer = keyNormalizer ?? KeyTrimNormalizer; - Factory = factory ?? ConnectionStringFactory; - Cache = new ConcurrentDictionary>(ProviderNameComparer.Instance); - } - - public KeyValuePair[] Configuration { get; } + public KeyValuePair[] Configuration { get; } = configuration; - public Func KeyNormalizer { get; } + public Func KeyNormalizer { get; } = keyNormalizer ?? KeyTrimNormalizer; - public Func[], Func, ProviderName?, IDictionary> Factory { get; } + public Func[], Func, ProviderName?, IDictionary> Factory { get; } = factory ?? ConnectionStringFactory; public IDictionary? Default { get; private set; } // for providerName is null - public ConcurrentDictionary> Cache { get; } + public ConcurrentDictionary> Cache { get; } = new ConcurrentDictionary>(ProviderNameComparer.Instance); public IDictionary this[ProviderName? providerName] { get { - if (providerName == null) - return Default ??= ConnStrFactory(); - - return Cache.GetOrAdd(providerName, _ => ConnStrFactory()); - + return providerName == null ? (Default ??= ConnStrFactory()) : Cache.GetOrAdd(providerName, _ => ConnStrFactory()); IDictionary ConnStrFactory() => Factory(Configuration, KeyNormalizer, providerName); } } diff --git a/src/NetLah.Extensions.Configuration/ProviderConnectionString.cs b/src/NetLah.Extensions.Configuration/ProviderConnectionString.cs index b0cae89..ba37c4c 100644 --- a/src/NetLah.Extensions.Configuration/ProviderConnectionString.cs +++ b/src/NetLah.Extensions.Configuration/ProviderConnectionString.cs @@ -5,21 +5,14 @@ namespace NetLah.Extensions.Configuration; /// /// Provider and connection string /// -public sealed class ProviderConnectionString : ProviderName +public sealed class ProviderConnectionString(string name, string connectionString, DbProviders provider = DbProviders.Custom, string? custom = null) : ProviderName(provider, custom) { private string? _expanded; - public ProviderConnectionString(string name, string connectionString, DbProviders provider = DbProviders.Custom, string? custom = null) - : base(provider, custom) - { - Name = name; - Raw = connectionString; - } - /// /// Connection string name /// - public string Name { get; } + public string Name { get; } = name; /// /// Expanded connection string value @@ -29,7 +22,7 @@ public ProviderConnectionString(string name, string connectionString, DbProvider /// /// Raw connection string value /// - public string Raw { get; } + public string Raw { get; } = connectionString; public IConfiguration? Configuration { get; internal set; } } diff --git a/src/NetLah.Extensions.Configuration/TransformConfigurationProvider.cs b/src/NetLah.Extensions.Configuration/TransformConfigurationProvider.cs index b85e4ae..e9f4d3e 100644 --- a/src/NetLah.Extensions.Configuration/TransformConfigurationProvider.cs +++ b/src/NetLah.Extensions.Configuration/TransformConfigurationProvider.cs @@ -3,17 +3,12 @@ namespace NetLah.Extensions.Configuration; -public class TransformConfigurationProvider : ConfigurationProvider +public class TransformConfigurationProvider(IConfigurationSection configurationSection) : ConfigurationProvider { - private readonly IConfigurationSection _configurationSection; + private readonly IConfigurationSection _configurationSection = configurationSection; private object? _lock = null; private IChangeToken? _token; - public TransformConfigurationProvider(IConfigurationSection configurationSection) - { - _configurationSection = configurationSection; - } - private void OnChange(object? obj) { Data.Clear(); diff --git a/src/NetLah.Extensions.Configuration/TransformConfigurationSource.cs b/src/NetLah.Extensions.Configuration/TransformConfigurationSource.cs index b990649..2777dc6 100644 --- a/src/NetLah.Extensions.Configuration/TransformConfigurationSource.cs +++ b/src/NetLah.Extensions.Configuration/TransformConfigurationSource.cs @@ -2,14 +2,9 @@ namespace NetLah.Extensions.Configuration; -public class TransformConfigurationSource : IConfigurationSource +public class TransformConfigurationSource(IConfigurationSection configurationSection) : IConfigurationSource { - private readonly IConfigurationSection _configurationSection; - - public TransformConfigurationSource(IConfigurationSection configurationSection) - { - _configurationSection = configurationSection; - } + private readonly IConfigurationSection _configurationSection = configurationSection; public IConfigurationProvider Build(IConfigurationBuilder builder) {