Skip to main content

Diagnostics

The source generator enforces correct usage at compile time via four diagnostic codes.

Diagnostic Table

CodeSeverityConditionRemediation
ZA001Error[Specification] applied to a classChange class to struct
ZA002ErrorStruct does not implement ISpecification<T>Add : ISpecification<YourType>
ZA003ErrorStruct is not declared partialAdd partial modifier
ZA004WarningStruct is not declared readonlyAdd readonly modifier

ZA001 — Not a struct

// ❌ Error ZA001
[Specification]
public class ActiveUserSpec : ISpecification<User> { ... }

// ✅ Fix
[Specification]
public readonly partial struct ActiveUserSpec : ISpecification<User> { ... }

ZA002 — Missing ISpecification<T>

// ❌ Error ZA002
[Specification]
public readonly partial struct ActiveUserSpec { ... }

// ✅ Fix
[Specification]
public readonly partial struct ActiveUserSpec : ISpecification<User> { ... }

ZA003 — Not partial

// ❌ Error ZA003
[Specification]
public readonly struct ActiveUserSpec : ISpecification<User> { ... }

// ✅ Fix
[Specification]
public readonly partial struct ActiveUserSpec : ISpecification<User> { ... }

ZA004 — Not readonly (Warning)

// ⚠️ Warning ZA004
[Specification]
public partial struct ActiveUserSpec : ISpecification<User> { ... }

// ✅ Fix
[Specification]
public readonly partial struct ActiveUserSpec : ISpecification<User> { ... }

readonly prevents the compiler from emitting defensive copies when passing the struct by value, which is important for performance.