Purview.ZodSharp.AspNetCore 2.0.0-prerelease.16

This is a prerelease version of Purview.ZodSharp.AspNetCore.
dotnet add package Purview.ZodSharp.AspNetCore --version 2.0.0-prerelease.16
                    
NuGet\Install-Package Purview.ZodSharp.AspNetCore -Version 2.0.0-prerelease.16
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Purview.ZodSharp.AspNetCore" Version="2.0.0-prerelease.16" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Purview.ZodSharp.AspNetCore" Version="2.0.0-prerelease.16" />
                    
Directory.Packages.props
<PackageReference Include="Purview.ZodSharp.AspNetCore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Purview.ZodSharp.AspNetCore --version 2.0.0-prerelease.16
                    
#r "nuget: Purview.ZodSharp.AspNetCore, 2.0.0-prerelease.16"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Purview.ZodSharp.AspNetCore@2.0.0-prerelease.16
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Purview.ZodSharp.AspNetCore&version=2.0.0-prerelease.16&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Purview.ZodSharp.AspNetCore&version=2.0.0-prerelease.16&prerelease
                    
Install as a Cake Tool

Purview.ZodSharp.AspNetCore

NuGet version Release

ASP.NET Core integration for Purview.ZodSharp NuGet version. Convert failed validation results into standard ProblemDetails / HttpValidationProblemDetails payloads while preserving the structured validation issues.

Installation

dotnet add package Purview.ZodSharp.AspNetCore

Usage

using ZodSharp.AspNetCore;

var result = BasketSchema.Validate(basket);

if (!result.IsSuccess)
{
    var problem = result.ToHttpValidationProblemDetails();
    return Results.ValidationProblem(
        problem.Errors,
        extensions: new Dictionary<string, object?>
        {
            ["issues"] = problem.Extensions["issues"],
        });
}

ToHttpValidationProblemDetails() maps each ValidationError to a standard HttpValidationProblemDetails.Errors entry keyed by its JSON path. The structured ValidationIssue metadata (code, origin, minimum/maximum, inclusive bounds, path, message) is preserved in the issues extension so clients get more than a flat message list.

A ValidationProblemDetails overload is also available:

var problem = result.ToValidationProblemDetails();

Exception handling

Thrown ZodExceptions (e.g. from a value object's strict deserialization) are converted automatically by an IExceptionHandler:

builder.Services.AddZodSharpProblemDetails();

var app = builder.Build();
app.UseExceptionHandler();

Dependency injection

AddZodSharp registers IZodSchemaFactory as a singleton and auto-registers every source-generated validator from the configured assemblies:

builder.Services.AddZodSharp(options =>
{
    options.ScanAssemblies.Add(typeof(UserDto).Assembly);
    options.ScanAssemblyGraphs.Add(typeof(Program).Assembly);
    options.ScanLoadedAssemblies = true;
});

The factory is registered only if one is not already present — the first AddZodSharp (or AddZodSharpFactory) call wins and later AddZodSharp configure callbacks are ignored, so state is never overwritten.

For modular apps, assembly contributions can also be added independently before building the provider:

builder.Services.AddZodSharp();
builder.Services.AddZodSharpAssembly(typeof(UserDto).Assembly);
builder.Services.AddZodSharpAssemblyGraph(typeof(Program).Assembly);
builder.Services.AddZodSharpLoadedAssemblies();
  • ScanAssemblies / AddZodSharpAssembly(...) scan exact assemblies.
  • ScanAssemblyGraphs / AddZodSharpAssemblyGraph(...) scan the root assembly plus its referenced assemblies.
  • ScanLoadedAssemblies / AddZodSharpLoadedAssemblies() scan the assemblies currently loaded into the application domain.
  • Exact, graph, and loaded-assembly contributions are additive before the service provider is built.

When to use which registration:

  • AddZodSharp (this package) — ASP.NET Core apps; registers the factory and can auto-discover generated validators.
  • AddZodSharpAssembly(...) / AddZodSharpAssemblyGraph(...) / AddZodSharpLoadedAssemblies() (this package) — modular ASP.NET Core apps; contribute generated-validator assembly sources additively.
  • AddZodSharpFactory (core package) — any .NET host; you register validators manually in the configure callback.
  • AddZodSharpProblemDetails (this package) — exception handling and ProblemDetails services only; it does not register the factory.
  • AddZodSchemaOptionsValidator<T> (core package) — options validation via IValidateOptions<T>; requires a factory registered first.

Mapping error types to status codes

The ErrorType factory (ErrorType, the [ErrorType] attribute, its source generator, and the ZODSASP001/ZODSASP002/ZODSASP003 analyzers) is part of the core Purview.ZodSharp package. This package adds the ErrorTypeRegistry and maps error codes to HTTP statuses and formatted messages:

using ZodSharp.AspNetCore;
using ZodSharp.Core;

public static partial class ConcurrentErrorType
{
    [ErrorType]
    public static readonly ErrorType SaveFailed = new(
        Code: "aggregate_save_failed",
        Category: "invalid_value",
        Description: "The aggregate could not be saved.",
        HttpStatus: 409,
        MessageFormat: "Aggregate '{AggregateId}' (of type {AggregateType}) failed to save",
        Parameters:
        [
            new("AggregateId", typeof(string)),
            new("AggregateType", typeof(string))
        ]);
}

ErrorTypeRegistry.Default.Register(ConcurrentErrorType.SaveFailed);

HttpStatus is stored on ErrorType purely for convenience — only this ASP.NET Core integration reads it when deriving the ProblemDetails response status. The optional Category is a broad grouping that can span many specific codes; the generated helpers copy it onto each ValidationError and it is surfaced on the serialized ValidationIssue in the issues extension.

Parameters can also be declared with the ErrorType.Param<T>("Name") helper instead of an explicit typeof(...); the analyzer and source generator handle both forms the same way:

Parameters:
[
    new("AggregateId", typeof(string)),
    ErrorType.Param<string>("AggregateType")
]

A ValidationError carrying parameters such as ["AggregateId"] = "agg-123" is then surfaced as a 409 Conflict response whose message reads Aggregate 'agg-123' (of type Invoice) failed to save. The analyzer ZODSASP001 (shipped with the core package) warns when a MessageFormat placeholder is not declared in Parameters.

Generated Create / Throw helpers

Because the class above is partial, the source generator bundled with the core package adds strongly typed helpers derived from the declared Parameters — each parameter is emitted with its declared typeof(...) type, or the ErrorType.Param<T> generic type argument:

// ValidationError with the code, the formatted message, and the typed parameters:
var error = ConcurrentErrorType.CreateSaveFailed("agg-123", "Invoice");

// ZodException carrying that ValidationError:
ConcurrentErrorType.ThrowSaveFailed("agg-123", "Invoice");

// Path and structured issue metadata can be populated too:
var error = ConcurrentErrorType.CreateSaveFailed(
    "agg-123",
    "Invoice",
    path: ["order", "items", "[0]"],
    origin: "collection",
    minimum: 1,
    maximum: 10,
    inclusive: true);

The generated helpers construct a typed ErrorTypeParameters instance (exposed through ValidationError.Parameters) whose values are validated against the declared types and can be read back through Get<T>(name).

The analyzer ZODSASP002 (shipped with the core package) warns when an ErrorType field's containing class is not declared partial.

Documentation

License

MIT — see the package metadata in Purview.ZodSharp.AspNetCore on NuGet.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  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.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Purview.ZodSharp.AspNetCore:

Package Downloads
Purview.EventSourcing.Admin.API

ASP.NET Minimal API endpoints for Purview EventSourcing Admin Portal with OpenAPI documentation.

Purview.EventSourcing.Admin.Site

Ready-to-use Razor Pages admin dashboard for Purview EventSourcing Admin Portal. Provides web UI for aggregate search, event inspection, and point-in-time projection queries.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.0-prerelease.16 0 9/21/2026
2.0.0-prerelease.15 0 9/21/2026
2.0.0-prerelease.14 0 9/21/2026
2.0.0-prerelease.13 32 9/20/2026
2.0.0-prerelease.12 41 9/20/2026
2.0.0-prerelease.11 38 9/19/2026
2.0.0-prerelease.10 39 9/19/2026
2.0.0-prerelease.9 47 9/18/2026
2.0.0-prerelease.8 32 9/17/2026
2.0.0-prerelease.7 48 9/17/2026
2.0.0-prerelease.6 91 9/14/2026
2.0.0-prerelease.5 71 9/12/2026
2.0.0-prerelease.4 57 9/12/2026
2.0.0-prerelease.3 93 9/8/2026
2.0.0-prerelease.2 69 9/6/2026
2.0.0-prerelease.1 65 9/5/2026