public void SetName_WithoutValue_Fails(string name)
        {
            // Arrange
            var options = new SecretProviderOptions();

            // Act / Assert
            Assert.ThrowsAny <ArgumentException>(() => options.Name = name);
        }
 private static SecretStoreSource CreateMutatedSecretSource(
     Func <IServiceProvider, ISecretProvider> createSecretProvider,
     SecretProviderOptions options)
 {
     return(new SecretStoreSource(serviceProvider =>
     {
         ISecretProvider secretProvider = createSecretProvider(serviceProvider);
         if (secretProvider is ICachedSecretProvider cachedSecretProvider)
         {
             var logger = serviceProvider.GetService <ILogger <MutatedSecretNameCachedSecretProvider> >();
             return new MutatedSecretNameCachedSecretProvider(cachedSecretProvider, options.MutateSecretName, logger);
         }
         {
             var logger = serviceProvider.GetService <ILogger <MutatedSecretNameSecretProvider> >();
             return new MutatedSecretNameSecretProvider(secretProvider, options.MutateSecretName, logger);
         }
     }, options));
 }
        /// <summary>
        /// Adds an <see cref="ISecretProvider"/> implementation to the secret store of the application.
        /// </summary>
        /// <param name="secretProvider">The provider which secrets are added to the secret store.</param>
        /// <param name="configureOptions">The function to configure the registration of the <see cref="ISecretProvider"/> in the secret store.</param>
        /// <returns>
        ///     The extended secret store with the given <paramref name="secretProvider"/>.
        /// </returns>
        /// <exception cref="ArgumentNullException">Thrown when the <paramref name="secretProvider"/> is <c>null</c>.</exception>
        public SecretStoreBuilder AddProvider(
            ISecretProvider secretProvider,
            Action <SecretProviderOptions> configureOptions)
        {
            Guard.NotNull(secretProvider, nameof(secretProvider), "Requires a secret provider to add to the secret store");

            var options = new SecretProviderOptions();

            configureOptions?.Invoke(options);

            if (options?.MutateSecretName is null)
            {
                SecretStoreSources.Add(new SecretStoreSource(secretProvider, options));
            }
            else
            {
                SecretStoreSources.Add(CreateMutatedSecretSource(serviceProvider => secretProvider, options));
            }

            return(this);
        }
        /// <summary>
        /// Adds an <see cref="ISecretProvider"/> implementation to the secret store of the application.
        /// </summary>
        /// <param name="secretProvider">The provider which secrets are added to the secret store.</param>
        /// <param name="configureOptions">The function to configure the registration of the <see cref="ISecretProvider"/> in the secret store.</param>
        /// <returns>
        ///     The extended secret store with the given <paramref name="secretProvider"/>.
        /// </returns>
        /// <exception cref="ArgumentNullException">Thrown when the <paramref name="secretProvider"/> is <c>null</c>.</exception>
        public SecretStoreBuilder AddProvider(
            ISecretProvider secretProvider,
            Action <SecretProviderOptions> configureOptions)
        {
            Guard.NotNull(secretProvider, nameof(secretProvider), "Requires a secret provider to add to the secret store");

            var options = new SecretProviderOptions();

            configureOptions?.Invoke(options);

            // ReSharper disable once ConstantConditionalAccessQualifier - options can still be 'null' when consumer set it to 'null'.
            if (options?.MutateSecretName is null)
            {
                SecretStoreSources.Add(new SecretStoreSource(secretProvider, options));
            }
            else
            {
                SecretStoreSources.Add(CreateMutatedSecretSource(serviceProvider => secretProvider, options));
            }

            return(this);
        }