Noundry.Sod

Zod-inspired schema validation for .NET with fluent API, type-safe validation, and comprehensive error messages. Build complex validation schemas with ease.

Why Choose Sod?

Modern validation inspired by Zod for TypeScript, adapted for .NET developers.

Type-Safe
Full IntelliSense support
Fluent
Chainable API
Zero
Dependencies

Primitives

String, Number, Boolean, Date with comprehensive validators.

Objects

Type-safe object validation with Pick, Omit, Partial, Required.

Arrays

Arrays, Sets, Tuples with length and content validation.

Transforms

Transform validated values, preprocessing, coercion.

Unions

Union, Intersection, Discriminated unions for complex types.

Clear Errors

Detailed validation errors with path information.

Installation

Get started with Sod in seconds

dotnet add package Noundry.Sod

Requirements

  • .NET 8.0 or higher
  • C# 12.0 or higher
  • Zero dependencies

Package Manager

Install-Package Noundry.Sod

Code Examples

See Sod in action with real-world examples

Quick Start

UserValidator.cs
using Sod;

// Define a schema
var userSchema = Sod.Object<User>()
    .Field(u => u.Username, Sod.String().Min(3).Max(20))
    .Field(u => u.Email, Sod.String().Email())
    .Field(u => u.Age, Sod.Number().Min(18).Max(100));

// Validate data
var result = userSchema.Parse(userData);
if (result.Success) {
    Console.WriteLine($"Valid user: {result.Data.Username}");
}

String Validations

StringValidation.cs
var emailSchema = Sod.String().Email();
var urlSchema = Sod.String().Url();
var uuidSchema = Sod.String().Uuid();
var regexSchema = Sod.String().Regex(@"^\d{3}-\d{2}-\d{4}$");

// Transformations
var upperSchema = Sod.String().Trim().ToUpperCase();

Complex Objects

ComplexValidator.cs
var addressSchema = Sod.Object<Address>()
    .Field(a => a.Street, Sod.String().NonEmpty())
    .Field(a => a.City, Sod.String().NonEmpty())
    .Field(a => a.PostalCode, Sod.String().Regex(@"^\d{5}$"));

var personSchema = Sod.Object<Person>()
    .Field(p => p.Name, Sod.String().Min(1))
    .Field(p => p.Age, Sod.Number().Min(0))
    .Field(p => p.Address, addressSchema)
    .Field(p => p.Tags, Sod.Array(Sod.String()).Optional());

Transforms & Refinements

Advanced.cs
// Password validation with custom refinements
var passwordSchema = Sod.String()
    .Min(8)
    .Refine(pwd => pwd.Any(char.IsDigit),
        "Password must contain a digit")
    .Refine(pwd => pwd.Any(char.IsUpper),
        "Password must contain an uppercase letter");

// Transform input to uppercase
var upperSchema = Sod.String()
    .Transform(s => s.ToUpper());

// Coerce string to number
var numberSchema = Sod.Coerce.Number();