Axial.Guardrails
0.11.3
Prefix Reserved
dotnet add package Axial.Guardrails --version 0.11.3
NuGet\Install-Package Axial.Guardrails -Version 0.11.3
<PackageReference Include="Axial.Guardrails" Version="0.11.3" />
<PackageVersion Include="Axial.Guardrails" Version="0.11.3" />
<PackageReference Include="Axial.Guardrails" />
paket add Axial.Guardrails --version 0.11.3
#r "nuget: Axial.Guardrails, 0.11.3"
#:package Axial.Guardrails@0.11.3
#addin nuget:?package=Axial.Guardrails&version=0.11.3
#tool nuget:?package=Axial.Guardrails&version=0.11.3
Axial
<picture> <source media="(prefers-color-scheme: dark)" srcset="docs/content/img/axial-readme-dark.svg"> <source media="(prefers-color-scheme: light)" srcset="docs/content/img/axial-readme-light.svg"> <img alt="Axial" src="docs/content/img/axial-readme-light.svg" width="160"> </picture>
Write asynchronous F# workflows whose expected failures and required dependencies are visible in their types.
Axial is pre-1.0 and its API may change before the first stable release.
Your first flow
A handler usually needs services and can fail, but a Task signature shows neither fact. Flow<'env, 'error, 'value>
makes both part of the contract.
open Axial
type CheckoutError =
| OrderNotFound of orderId: int
| PaymentDeclined of reason: string
type Receipt = { OrderId: int; Total: decimal; Reference: string }
type CheckoutEnv =
{ FindTotal: int -> ColdTask<Result<decimal, CheckoutError>>
Charge: decimal -> ColdTask<Result<string, CheckoutError>>
Clock: IClock }
interface IHasClock with
member this.Clock = this.Clock
let checkout orderId : Flow<CheckoutEnv, CheckoutError, Receipt> =
flow {
let! findTotal = Flow.envWith _.FindTotal
let! charge = Flow.envWith _.Charge
let! total = findTotal orderId
let! reference = charge total
return { OrderId = orderId; Total = total; Reference = reference }
}
The application supplies live functions. A test supplies a record of fakes. The workflow does not change.
Adding a timeout and a retry policy leaves the Flow<CheckoutEnv, CheckoutError, Receipt> signature unchanged — these
combinators only require the environment to provide a clock (IHasClock) — because the runtime that starts the
workflow owns cancellation, retries, and cleanup:
open System
let checkoutOrder orderId : Flow<CheckoutEnv, CheckoutError, Receipt> =
checkout orderId
|> Flow.retry (Schedule.recurs 2)
|> Flow.timeout (TimeSpan.FromSeconds 5.0) (PaymentDeclined "checkout timed out")
Flow also carries concurrency, scheduling, streams, and structured child fibers through the same runtime.
Install
dotnet add package Axial
Package family
Axial: the core workflow model: typed failures, dependencies, concurrency, resources, schedules, and streams.Axial.Process: external process composition, pipelines, streaming output, typed failures, cancellation, and cleanup.Axial.HttpClient: typed HTTP requests, response handling, and reliability policies.
Experimental Axial.Hosting.AspNetCore and Axial.Hosting.GenHttp host Reified HTTP contracts on Axial workflows. Supporting packages provide platform services, console and file-system access, hosting, telemetry, and layers. See the package maturity table for each package's rating and application evidence. The package catalogue links the first-class libraries and the complete compatibility matrix.
Documentation and examples
- Getting started
- Add Axial to an existing Task application
- Failures and defects
- Dependencies and services
- Concurrency
- Process
- HTTP client
- Runnable examples
- Integration reference application and HTTP host examples
Reified integration
Reified declares value, model, JSON, and HTTP contracts. Axial's optional server adapters execute Reified HTTP contracts as workflows; neither core depends on the other.
Learn more about Target Frameworks and .NET Standard.
This package has 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.