private void CopyToClipboard(Vault vault)
        {
            PropertyObject po = null;

            switch (Collection)
            {
            case VaultUriCollection.Keys:
                return;

            case VaultUriCollection.Certificates:
                var cb   = vault.GetCertificateAsync(ItemName, Version, CancellationToken.None).GetAwaiter().GetResult();
                var cert = vault.GetCertificateWithExportableKeysAsync(ItemName, Version, CancellationToken.None).GetAwaiter().GetResult();
                po = new PropertyObjectCertificate(cb, cb.Policy, cert, null);
                break;

            case VaultUriCollection.Secrets:
                var s = vault.GetSecretAsync(ItemName, Version, CancellationToken.None).GetAwaiter().GetResult();
                po = new PropertyObjectSecret(s, null);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(Collection), $"Invalid endpoint {Collection}");
            }
            po.CopyToClipboard(true);
        }
        private static async Task <ListViewItemSecret> NewOrUpdateAsync(ISession session, object originalObject, PropertyObject newObject, CancellationToken cancellationToken)
        {
            SecretBundle         sOriginal = (SecretBundle)originalObject;
            PropertyObjectSecret posNew    = (PropertyObjectSecret)newObject;
            SecretBundle         s         = null;

            // New secret, secret rename or new value
            if ((sOriginal == null) || (sOriginal.SecretIdentifier.Name != posNew.Name) || (sOriginal.Value != posNew.RawValue))
            {
                s = await session.CurrentVault.SetSecretAsync(posNew.Name, posNew.RawValue, posNew.ToTagsDictionary(), ContentTypeEnumConverter.GetDescription(posNew.ContentType), posNew.ToSecretAttributes(), cancellationToken);
            }
            else // Same secret name and value
            {
                s = await session.CurrentVault.UpdateSecretAsync(posNew.Name, null, posNew.ToTagsDictionary(), ContentTypeEnumConverter.GetDescription(posNew.ContentType), posNew.ToSecretAttributes(), cancellationToken);
            }
            string oldSecretName = sOriginal?.SecretIdentifier.Name;

            if ((oldSecretName != null) && (oldSecretName != posNew.Name)) // Delete old secret
            {
                await session.CurrentVault.DeleteSecretAsync(oldSecretName, cancellationToken);
            }
            return(new ListViewItemSecret(session, s));
        }