Zod-inspired schema validation for .NET with fluent API, type-safe validation, and comprehensive error messages. Build complex validation schemas with ease.
Modern validation inspired by Zod for TypeScript, adapted for .NET developers.
String, Number, Boolean, Date with comprehensive validators.
Type-safe object validation with Pick, Omit, Partial, Required.
Arrays, Sets, Tuples with length and content validation.
Transform validated values, preprocessing, coercion.
Union, Intersection, Discriminated unions for complex types.
Detailed validation errors with path information.
Get started with Sod in seconds
dotnet add package Noundry.Sod
Install-Package Noundry.Sod
See Sod in action with real-world examples
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}");
}
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();
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());
// 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();