Validation - Definition
Eicrud's validation happens at the controller level (between the client, and your services).
Entities and commands DTOs are validated the same way.
You can use any class-validator decorator in your DTOs.
Note
Fields that aren't annotated with a class-validator decorator won't be allowed in the DTO. You can use the @Allow decorator to bypass that rule, but we recommend using proper validation instead. 
Nested Validation
class-validator's @ValidateNested will only work when decorator @$Type is applied.
import { $Type } from '@eicrud/core/validation'
export class CmdDto {
    @$Type(Slice)
    @ValidateNested()
    firstSlice: Slice;
}
Eicrud decorators
Eicrud offers custom decorators you can use.
$MaxSize(size: number, addPerTrustPoint?: number)
Specify the max length of the stringified argument.
import { $MaxSize } from '@eicrud/core/validation'
export class CmdDto {
    @$MaxSize(300)
    bio: string;
}
Warning
By default, every DTO field has a max stringified size of 50 (specified in ValidationOptions->defaultMaxSize). This means you need to decorate fields with     @$MaxSize(x) to bypass this limit. Using class-validator's @MaxLength won't affect that limit. Setting defaultMaxSize to 0 disables that check.
$MaxArLength(length: number, addPerTrustPoint?: number)
Specify the max length of an array argument.
import { $MaxArLength } from '@eicrud/core/validation'
export class CmdDto {
    @$Type(Seed)
    @$MaxArLength(5)
    seeds: Seed[];
}
Note
@$MaxArLength must be used with @$Type decorator, or else @$MaxSize will be applied.
Warning
By default, @$Type DTO fields have a max length of 20 (specified in ValidationOptions->defaultMaxArLength). This means you need to decorate fields with     @$MaxArLength(x) to bypass this limit.
Validation Pipe
You can use CrudValidationPipe to apply Eicrud's validation and transforms to your own NestJS controllers.
import { CrudValidationPipe } from '@eicrud/core/validation';
@Get('hello')
async get(@Query(new CrudValidationPipe()) query: MyQuery) {
    return `Hello ${query.name}`;
}
export class MyQuery {
    @IsOptional()
    @IsString()
    @$Transform((value) => value.toUpperCase())
    name: string;
}