SafePipeline 1.0.0
dotnet add package SafePipeline --version 1.0.0
NuGet\Install-Package SafePipeline -Version 1.0.0
<PackageReference Include="SafePipeline" Version="1.0.0" />
paket add SafePipeline --version 1.0.0
#r "nuget: SafePipeline, 1.0.0"
// Install SafePipeline as a Cake Addin
#addin nuget:?package=SafePipeline&version=1.0.0
// Install SafePipeline as a Cake Tool
#tool nuget:?package=SafePipeline&version=1.0.0
SafePipeline
About
Why does it exist
- to enable easily readable pipelines of composable functions
- to manage exception handling
- to allow real code re-use with small testable unit of code (functions)
- to reduce cyclomatic complexity
How it works
SafePipeline is fundamentally a monad that includes exception handling and the mixing of synchronous and asynchronous functions. A pipeline is started using an initial value (StartWith). functions are then passed to each step in the pipeline - each of these functions performs a single action and returns the transformed value. Simple continue / skip can be implemented using the Check method. This method allows you to provide a function that can return an Operable instance and therefore tell the pipeline whether to continue to the next step or skip to the end in a success state as no processing is required (for example)
Setting up
Nuget
https://www.nuget.org/packages/SafePipeline/
Install-Package SafePipeline -Version 1.0.0
Examples
Controller method
public async Task<IActionResult> Get()
{
Item[] result = StartWith(new PipelineContext())
.Then(Configure)
.Then(OpenDatabaseConnection)
.Check(SearchIndex)
.Then(ReadMatches)
.OnSuccess(CloseDatabaseConnection)
.OnSkip(s => _logger.Information("No items found in the index"))
.OnSuccess(s => _logger.Information($"{s.Get<Item[]>().Length} items found"))
.OnFailure(LogException)
.ThrowOnException();
return Ok(result)
}
you can see from the above that the code can easily be shared with methods like OpenDatabaseConnection etc.
Please see the tests in the project for working examples
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.