Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Threading;
using System.Threading.Tasks;
using Azure;
using Azure.Core;

namespace Proto.Authorization
{
/// <summary>
/// A class representing an arm operation wrapper object.
/// </summary>
/// <typeparam name="TOperations"> The <see cref="ResourceOperationsBase"/> to convert TModel into. </typeparam>
/// <typeparam name="TModel"> The model returned by existing Operation methods. </typeparam>
public class PhArmOperation<TOperations, TModel> : Operation<TOperations>
where TOperations : class
where TModel : class
{
private readonly Func<TModel, TOperations> _converter;
private readonly Operation<TModel> _wrappedOperation;
private readonly Operation<TModel> _wrappedResponseOperation;

/// <summary>
/// Initializes a new instance of the <see cref="PhArmOperation{TOperations, TModel}"/> class.
/// </summary>
/// <param name="wrapped"> The results to wrap. </param>
/// <param name="converter"> The function used to convert from existing type to new type. </param>
public PhArmOperation(Operation<TModel> wrapped, Func<TModel, TOperations> converter)
{
if (wrapped is null)
{
throw new ArgumentNullException(nameof(wrapped));
}

if (converter is null)
{
throw new ArgumentNullException(nameof(converter));
}

_wrappedOperation = wrapped;
_converter = converter;
}

/// <summary>
/// Initializes a new instance of the <see cref="PhArmOperation{TOperations, TModel}"/> class.
/// </summary>
/// <param name="wrapped"> The results to wrap. </param>
/// <param name="converter"> The function used to convert from existing type to new type. </param>
public PhArmOperation(Response<TModel> wrapped, Func<TModel, TOperations> converter)
{
if (wrapped is null)
{
throw new ArgumentNullException(nameof(wrapped));
}

if (converter is null)
{
throw new ArgumentNullException(nameof(converter));
}

_wrappedResponseOperation = new PhValueArmOperation<TModel>(wrapped);
_converter = converter;
}

/// <summary>
/// Initializes a new instance of the <see cref="PhArmOperation{TOperations, TModel}"/> class for mocking.
/// </summary>
protected PhArmOperation()
{
}

/// <inheritdoc/>
public override string Id => _wrappedOperation?.Id;

/// <inheritdoc/>
public override TOperations Value => _converter(_doesWrapOperation ? _wrappedOperation.Value : _wrappedResponseOperation.Value);

/// <inheritdoc/>
public override bool HasCompleted => _doesWrapOperation ? _wrappedOperation.HasCompleted : _wrappedResponseOperation.HasCompleted;

/// <inheritdoc/>
public override bool HasValue => _doesWrapOperation ? _wrappedOperation.HasValue : _wrappedResponseOperation.HasValue;

[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1300:Element should begin with upper-case letter", Justification = "<Pending>")]
private bool _doesWrapOperation => _wrappedResponseOperation is null;

/// <inheritdoc/>
public override Response GetRawResponse()
{
return _doesWrapOperation ? _wrappedOperation.GetRawResponse() : _wrappedResponseOperation.GetRawResponse();
}

/// <inheritdoc/>
public override Response UpdateStatus(CancellationToken cancellationToken = default)
{
return _doesWrapOperation ? _wrappedOperation.UpdateStatus(cancellationToken) : _wrappedResponseOperation.UpdateStatus(cancellationToken);
}

/// <inheritdoc/>
public override ValueTask<Response> UpdateStatusAsync(CancellationToken cancellationToken = default)
{
return _doesWrapOperation
? _wrappedOperation.UpdateStatusAsync(cancellationToken)
: _wrappedResponseOperation.UpdateStatusAsync(cancellationToken);
}

/// <inheritdoc/>
public override async ValueTask<Response<TOperations>> WaitForCompletionAsync(CancellationToken cancellationToken = default)
{
var task = WaitForCompletionAsync(OperationInternals.DefaultPollingInterval, cancellationToken);
return await task.ConfigureAwait(false);
}

/// <inheritdoc/>
public override async ValueTask<Response<TOperations>> WaitForCompletionAsync(TimeSpan pollingInterval, CancellationToken cancellationToken)
{
var value = _doesWrapOperation
? await _wrappedOperation.WaitForCompletionAsync(pollingInterval, cancellationToken).ConfigureAwait(false)
: await _wrappedResponseOperation.WaitForCompletionAsync(pollingInterval, cancellationToken).ConfigureAwait(false);
return Response.FromValue(_converter(value.Value), GetRawResponse());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Threading;
using System.Threading.Tasks;
using Azure;
using Azure.Core;

namespace Proto.Authorization
{
/// <summary>
/// A class representing an arm operation wrapper object.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1618:Generic type parameters should be documented", Justification = "<Pending>")]
internal class PhValueArmOperation<TOperations> : Operation<TOperations>
where TOperations : class
{
private readonly Operation<TOperations> _wrappedOperation;
private readonly OperationOrResponseInternals<TOperations> _wrappedResponseOperation;

/// <summary>
/// Initializes a new instance of the <see cref="PhValueArmOperation{TOperations}"/> class for mocking.
/// </summary>
protected PhValueArmOperation()
{
}

/// <summary>
/// Initializes a new instance of the <see cref="PhValueArmOperation{TOperations}"/>.
/// </summary>
/// <param name="wrapped"> The operation object to wrap. </param>
public PhValueArmOperation(Operation<TOperations> wrapped)
{
if (wrapped is null)
throw new ArgumentNullException(nameof(wrapped));

_wrappedOperation = wrapped;
}

/// <summary>
/// Initializes a new instance of the <see cref="PhValueArmOperation{TOperations}"/>.
/// </summary>
/// <param name="wrapped"> The response object to wrap. </param>
public PhValueArmOperation(Response<TOperations> wrapped)
{
if (wrapped is null)
throw new ArgumentNullException(nameof(wrapped));

_wrappedResponseOperation = new OperationOrResponseInternals<TOperations>(wrapped);
}

private bool _doesWrapOperation => _wrappedResponseOperation is null;

public override TOperations Value => _doesWrapOperation ? _wrappedOperation.Value : _wrappedResponseOperation.Value;

public override bool HasValue => _doesWrapOperation ? _wrappedOperation.HasValue : _wrappedResponseOperation.HasValue;

public override string Id => _wrappedOperation?.Id;

public override bool HasCompleted => _doesWrapOperation ? _wrappedOperation.HasCompleted : _wrappedResponseOperation.HasCompleted;

public override Response GetRawResponse() => _doesWrapOperation? _wrappedOperation.GetRawResponse() : _wrappedResponseOperation.GetRawResponse();

public override Response UpdateStatus(CancellationToken cancellationToken = default) => _doesWrapOperation ? _wrappedOperation.UpdateStatus(cancellationToken) : _wrappedResponseOperation.UpdateStatus(cancellationToken);

public override ValueTask<Response> UpdateStatusAsync(CancellationToken cancellationToken = default) => _doesWrapOperation ? _wrappedOperation.UpdateStatusAsync(cancellationToken) : _wrappedResponseOperation.UpdateStatusAsync(cancellationToken);

public override ValueTask<Response<TOperations>> WaitForCompletionAsync(CancellationToken cancellationToken = default) => _doesWrapOperation ? _wrappedOperation.WaitForCompletionAsync(cancellationToken) : _wrappedResponseOperation.WaitForCompletionAsync(cancellationToken);

public override ValueTask<Response<TOperations>> WaitForCompletionAsync(TimeSpan pollingInterval, CancellationToken cancellationToken) => _doesWrapOperation ? _wrappedOperation.WaitForCompletionAsync(pollingInterval, cancellationToken) : _wrappedResponseOperation.WaitForCompletionAsync(pollingInterval, cancellationToken);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Threading;
using System.Threading.Tasks;
using Azure;
using Azure.Core;

namespace Proto.Authorization
{
/// <summary>
/// A class representing an arm operation wrapper object.
/// </summary>
public class PhVoidArmOperation : Operation
{
private readonly Operation _wrappedOperation;
private readonly OperationOrResponseInternals _wrappedResponseOperation;

/// <summary>
/// Initializes a new instance of the <see cref="PhVoidArmOperation"/> class for mocking.
/// </summary>
protected PhVoidArmOperation()
{
}

/// <summary>
/// Initializes a new instance of the <see cref="PhVoidArmOperation"/> class.
/// </summary>
/// <param name="wrapped"> The results to wrap. </param>
public PhVoidArmOperation(Operation wrapped)
{
if (wrapped is null)
throw new ArgumentNullException(nameof(wrapped));

_wrappedOperation = wrapped;
}

/// <summary>
/// Initializes a new instance of the <see cref="PhVoidArmOperation"/> class.
/// </summary>
/// <param name="wrapped"> The results to wrap. </param>
public PhVoidArmOperation(Response wrapped)
{
if (wrapped is null)
throw new ArgumentNullException(nameof(wrapped));

_wrappedResponseOperation = new OperationOrResponseInternals(wrapped);
}

private bool _doesWrapOperation => _wrappedResponseOperation is null;

/// <inheritdoc/>
public override string Id => _wrappedOperation?.Id;

/// <inheritdoc/>
public override bool HasCompleted => _doesWrapOperation ? _wrappedOperation.HasCompleted : _wrappedResponseOperation.HasCompleted;

/// <inheritdoc/>
public override Response GetRawResponse() => _doesWrapOperation ? _wrappedOperation.GetRawResponse() : _wrappedResponseOperation.GetRawResponse();

/// <inheritdoc/>
public override Response UpdateStatus(CancellationToken cancellationToken = default) =>
_doesWrapOperation
? _wrappedOperation.UpdateStatus(cancellationToken)
: _wrappedResponseOperation.UpdateStatus(cancellationToken);

/// <inheritdoc/>
public override ValueTask<Response> UpdateStatusAsync(CancellationToken cancellationToken = default) =>
_doesWrapOperation
? _wrappedOperation.UpdateStatusAsync(cancellationToken)
: _wrappedResponseOperation.UpdateStatusAsync(cancellationToken);

/// <inheritdoc/>
public override ValueTask<Response> WaitForCompletionResponseAsync(CancellationToken cancellationToken = default) =>
WaitForCompletionResponseAsync(OperationInternals.DefaultPollingInterval, cancellationToken);

/// <inheritdoc/>
public override ValueTask<Response> WaitForCompletionResponseAsync(TimeSpan pollingInterval, CancellationToken cancellationToken) =>
_doesWrapOperation
? _wrappedOperation.WaitForCompletionResponseAsync(pollingInterval, cancellationToken)
: _wrappedResponseOperation.WaitForCompletionResponseAsync(pollingInterval, cancellationToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>Proto.Authorization</RootNamespace>
<LangVersion>latest</LangVersion>
<IncludeGeneratorSharedCode>true</IncludeGeneratorSharedCode>
<IsPackable>false</IsPackable>
<WarningLevel>0</WarningLevel>
</PropertyGroup>

<ItemGroup>
Expand All @@ -15,6 +17,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Azure.AutoRest.CSharp" Version="3.0.0-beta.20210521.1" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.1.1" />
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
<PrivateAssets>all</PrivateAssets>
Expand Down
Loading