pulumi/sdk/dotnet/Pulumi.Automation/PulumiFn.cs
Sean Fausett 3530ba3205
[dotnet] Fix Resharper code issues (#7178)
* Fix resharper code issues for language usage opportunities

* Fix resharper code issues for common practices and code improvements

* Fix resharper code issues for potential code quality issues

* Fix resharper code issues for redundancies in code

* Fix xunit test output

* Update changelog

* Fix resharper code issues for compiler warnings

* Fix resharper code issues for inconsistent naming

* Add resharper solution settings file

* Fix resharper code issues for potential code quality issues

* Fix resharper code issues for redundancies in code

* Fix resharper code issues for redundancies in symbol declarations
2021-06-10 10:32:33 -04:00

123 lines
5.3 KiB
C#

// Copyright 2016-2021, Pulumi Corporation
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Runtime.ExceptionServices;
using System.Threading;
using System.Threading.Tasks;
namespace Pulumi.Automation
{
/// <summary>
/// A Pulumi program as an inline function (in process).
/// </summary>
public abstract class PulumiFn
{
internal PulumiFn()
{
}
internal abstract Task<ExceptionDispatchInfo?> InvokeAsync(IRunner runner, CancellationToken cancellationToken);
/// <summary>
/// Creates an asynchronous inline (in process) pulumi program.
/// </summary>
/// <param name="program">An asynchronous pulumi program that takes in a <see cref="CancellationToken"/> and returns an output.</param>
public static PulumiFn Create(Func<CancellationToken, Task<IDictionary<string, object?>>> program)
=> new PulumiFnInline(program);
/// <summary>
/// Creates an asynchronous inline (in process) pulumi program.
/// </summary>
/// <param name="program">An asynchronous pulumi program that returns an output.</param>
public static PulumiFn Create(Func<Task<IDictionary<string, object?>>> program)
=> new PulumiFnInline(cancellationToken => program());
/// <summary>
/// Creates an asynchronous inline (in process) pulumi program.
/// </summary>
/// <param name="program">An asynchronous pulumi program that takes in a <see cref="CancellationToken"/>.</param>
public static PulumiFn Create(Func<CancellationToken, Task> program)
{
async Task<IDictionary<string, object?>> Wrapper(CancellationToken cancellationToken)
{
await program(cancellationToken).ConfigureAwait(false);
return ImmutableDictionary<string, object?>.Empty;
}
return new PulumiFnInline(Wrapper);
}
/// <summary>
/// Creates an asynchronous inline (in process) pulumi program.
/// </summary>
/// <param name="program">An asynchronous pulumi program.</param>
public static PulumiFn Create(Func<Task> program)
{
async Task<IDictionary<string, object?>> Wrapper(CancellationToken cancellationToken)
{
await program().ConfigureAwait(false);
return ImmutableDictionary<string, object?>.Empty;
}
return new PulumiFnInline(Wrapper);
}
/// <summary>
/// Creates an inline (in process) pulumi program.
/// </summary>
/// <param name="program">A pulumi program that returns an output.</param>
public static PulumiFn Create(Func<IDictionary<string, object?>> program)
{
Task<IDictionary<string, object?>> Wrapper(CancellationToken cancellationToken)
{
var output = program();
return Task.FromResult(output);
}
return new PulumiFnInline(Wrapper);
}
/// <summary>
/// Creates an inline (in process) pulumi program.
/// </summary>
/// <param name="program">A pulumi program.</param>
public static PulumiFn Create(Action program)
=> Create(() => { program(); return ImmutableDictionary<string, object?>.Empty; });
/// <summary>
/// Creates an inline (in process) pulumi program via a traditional <see cref="Pulumi.Stack"/> implementation.
/// </summary>
/// <typeparam name="TStack">The <see cref="Pulumi.Stack"/> type.</typeparam>
public static PulumiFn Create<TStack>()
where TStack : Stack, new()
=> new PulumiFn<TStack>(() => new TStack());
/// <summary>
/// Creates an inline (in process) pulumi program via a traditional <see cref="Pulumi.Stack"/> implementation.
/// <para/>
/// When invoked, a new stack instance will be resolved based
/// on the provided <typeparamref name="TStack"/> type parameter
/// using the <paramref name="serviceProvider"/>.
/// </summary>
/// <typeparam name="TStack">The <see cref="Pulumi.Stack"/> type.</typeparam>
/// <param name="serviceProvider">The service provider that will be used to resolve an instance of <typeparamref name="TStack"/>.</param>
public static PulumiFn Create<TStack>(IServiceProvider serviceProvider)
where TStack : Stack
=> new PulumiFnServiceProvider(serviceProvider, typeof(TStack));
/// <summary>
/// Creates an inline (in process) pulumi program via a traditional <see cref="Pulumi.Stack"/> implementation.
/// <para/>
/// When invoked, a new stack instance will be resolved based
/// on the provided <paramref name="stackType"/> type parameter
/// using the <paramref name="serviceProvider"/>.
/// </summary>
/// <param name="serviceProvider">The service provider that will be used to resolve an instance of type <paramref name="stackType"/>.</param>
/// <param name="stackType">The stack type, which must derive from <see cref="Pulumi.Stack"/>.</param>
public static PulumiFn Create(IServiceProvider serviceProvider, Type stackType)
=> new PulumiFnServiceProvider(serviceProvider, stackType);
}
}