public ServicePrincipalInKVCredential(string dataSourceCredentialName, ServicePrincipalInKVParam parameters) : base(dataSourceCredentialName)
        {
            if (dataSourceCredentialName == null)
            {
                throw new ArgumentNullException(nameof(dataSourceCredentialName));
            }
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            Parameters = parameters;
            DataSourceCredentialType = DataSourceCredentialType.ServicePrincipalInKV;
        }
        internal static ServicePrincipalInKVCredential DeserializeServicePrincipalInKVCredential(JsonElement element)
        {
            ServicePrincipalInKVParam parameters = default;
            DataSourceCredentialType  dataSourceCredentialType = default;
            Optional <Guid>           dataSourceCredentialId   = default;
            string            dataSourceCredentialName         = default;
            Optional <string> dataSourceCredentialDescription  = default;

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("parameters"))
                {
                    parameters = ServicePrincipalInKVParam.DeserializeServicePrincipalInKVParam(property.Value);
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialType"))
                {
                    dataSourceCredentialType = new DataSourceCredentialType(property.Value.GetString());
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialId"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    dataSourceCredentialId = property.Value.GetGuid();
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialName"))
                {
                    dataSourceCredentialName = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialDescription"))
                {
                    dataSourceCredentialDescription = property.Value.GetString();
                    continue;
                }
            }
            return(new ServicePrincipalInKVCredential(dataSourceCredentialType, Optional.ToNullable(dataSourceCredentialId), dataSourceCredentialName, dataSourceCredentialDescription.Value, parameters));
        }
        internal static ServicePrincipalInKeyVaultDatasourceCredential DeserializeServicePrincipalInKeyVaultDatasourceCredential(JsonElement element)
        {
            ServicePrincipalInKVParam parameters = default;
            DataSourceCredentialType  dataSourceCredentialType = default;
            Optional <string>         dataSourceCredentialId   = default;
            string            dataSourceCredentialName         = default;
            Optional <string> dataSourceCredentialDescription  = default;

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("parameters"))
                {
                    parameters = ServicePrincipalInKVParam.DeserializeServicePrincipalInKVParam(property.Value);
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialType"))
                {
                    dataSourceCredentialType = new DataSourceCredentialType(property.Value.GetString());
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialId"))
                {
                    dataSourceCredentialId = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialName"))
                {
                    dataSourceCredentialName = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("dataSourceCredentialDescription"))
                {
                    dataSourceCredentialDescription = property.Value.GetString();
                    continue;
                }
            }
            return(new ServicePrincipalInKeyVaultDatasourceCredential(dataSourceCredentialType, dataSourceCredentialId.Value, dataSourceCredentialName, dataSourceCredentialDescription.Value, parameters));
        }
        /// <summary>
        /// Initializes a new instance of <see cref="Administration.ServicePrincipalInKeyVaultCredentialEntity"/> for mocking purposes.
        /// </summary>
        /// <param name="id">Sets the <see cref="DataSourceCredentialEntity.Id"/> property.</param>
        /// <param name="name">Sets the <see cref="DataSourceCredentialEntity.Name"/> property.</param>
        /// <param name="description">Sets the <see cref="DataSourceCredentialEntity.Description"/> property.</param>
        /// <param name="endpoint">Sets the <see cref="ServicePrincipalInKeyVaultCredentialEntity.Endpoint"/> property.</param>
        /// <param name="keyVaultClientId">Sets the <see cref="ServicePrincipalInKeyVaultCredentialEntity.KeyVaultClientId"/> property.</param>
        /// <param name="keyVaultClientSecret">Sets the Key Vault client secret. This secret is not exposed in a property.</param>
        /// <param name="secretNameForClientId">Sets the <see cref="ServicePrincipalInKeyVaultCredentialEntity.SecretNameForClientId"/> property.</param>
        /// <param name="secretNameForClientSecret">Sets the <see cref="ServicePrincipalInKeyVaultCredentialEntity.SecretNameForClientSecret"/> property.</param>
        /// <param name="tenantId">Sets the <see cref="ServicePrincipalInKeyVaultCredentialEntity.TenantId"/> property.</param>
        /// <returns>A new instance of <see cref="Administration.ServicePrincipalInKeyVaultCredentialEntity"/> for mocking purposes.</returns>
        public static ServicePrincipalInKeyVaultCredentialEntity ServicePrincipalInKeyVaultCredentialEntity(string id = null, string name = null, string description = null, Uri endpoint = null, string keyVaultClientId = null, string keyVaultClientSecret = null, string secretNameForClientId = null, string secretNameForClientSecret = null, string tenantId = null)
        {
            ServicePrincipalInKVParam parameters = new ServicePrincipalInKVParam(endpoint?.AbsoluteUri, keyVaultClientId, keyVaultClientSecret, secretNameForClientId, secretNameForClientSecret, tenantId);

            return(new ServicePrincipalInKeyVaultCredentialEntity(DataSourceCredentialKind.ServicePrincipalInKeyVault, id, name, description, parameters));
        }
 internal ServicePrincipalInKeyVaultDatasourceCredential(DataSourceCredentialType dataSourceCredentialType, string id, string name, string description, ServicePrincipalInKVParam parameters)
     : base(dataSourceCredentialType, id, name, description)
 {
     DataSourceCredentialType = dataSourceCredentialType;
     Endpoint                  = new Uri(parameters.KeyVaultEndpoint);
     KeyVaultClientId          = parameters.KeyVaultClientId;
     KeyVaultClientSecret      = parameters.KeyVaultClientSecret;
     TenantId                  = parameters.TenantId;
     SecretNameForClientId     = parameters.ServicePrincipalIdNameInKV;
     SecretNameForClientSecret = parameters.ServicePrincipalSecretNameInKV;
 }
 internal ServicePrincipalInKVCredential(DataSourceCredentialType dataSourceCredentialType, Guid?dataSourceCredentialId, string dataSourceCredentialName, string dataSourceCredentialDescription, ServicePrincipalInKVParam parameters) : base(dataSourceCredentialType, dataSourceCredentialId, dataSourceCredentialName, dataSourceCredentialDescription)
 {
     Parameters = parameters;
     DataSourceCredentialType = dataSourceCredentialType;
 }