Skip to content

# Validation

Ignyx leverages the power of Pydantic v2 for high-speed data validation and schema enforcement. This allows you to define the structure of your data once and have Ignyx handle the validation and parsing automatically.

## Overview

When you type-hint a route handler parameter with a Pydantic `BaseModel`, Ignyx automatically: 1. Reads the request body. 2. Validates the data against the model. 3. Returns a `422 Unprocessable Entity` response if validation fails. 4. Passes the parsed model instance to your handler.

## Basic Example

Define a model and use it in your route.

    from pydantic import BaseModel
    from ignyx import Ignyx

    app = Ignyx()

    class User(BaseModel):
        name: str
        age: int

    @app.post("/users")
    def create_user(user: User):
        return {"message": f"Hello {user.name}, you are {user.age}!"}

## Nested Models

You can nest models to represent complex data structures.

    class Address(BaseModel):
        city: str
        country: str

    class Profile(BaseModel):
        username: str
        address: Address

    @app.post("/profile")
    def update_profile(profile: Profile):
        return {"city": profile.address.city}

## Optional Fields

Use Python's type system to define optional fields.

    from typing import Optional

    class Item(BaseModel):
        name: str
        description: Optional[str] = None # Or use name: str | None = None
        price: float

## Validation Errors

If a client sends invalid data, Ignyx automatically returns a structured `422` error response.

Request:

    {
        "name": "Saketh",
        "age": "invalid_age"
    }

Response (422):

    {
        "detail": [
            {
                "loc": ["body", "age"],
                "msg": "Input should be a valid integer",
                "type": "int_parsing"
            }
        ]
    }

## Field Validators

You can add custom validation logic using Pydantic's `@field_validator`.

    from pydantic import BaseModel, field_validator

    class Signup(BaseModel):
        username: str
        password: str

        @field_validator('username')
        @classmethod
        def username_must_be_long(cls, v: str) -> str:
            if len(v) < 3:
                raise ValueError('Username is too short')
            return v

## API Reference

Ignyx supports any Pydantic `BaseModel`. For full documentation on model features, see the Pydantic Documentation.