Skip to content

Commit 374a405

Browse files
committed
docs: prefer enumValues over enumString when Dart enum exists
- Reorder enum schema listings to show enumValues first across all docs - Update examples to use Ack.enumValues with Dart enums instead of enumString - Clarify that enumString is for ad-hoc string lists without backing enums - Update @AckModel examples to use Dart enum fields (which auto-generate enumValues) - Consolidate preference guidance to api-reference and llms.txt to avoid repetition - Apply Diataxis principles: reference describes, how-to guides show by example
1 parent 358b676 commit 374a405

7 files changed

Lines changed: 23 additions & 27 deletions

File tree

docs/api-reference/index.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ Entry point for creating schemas. See [Schema Types](../core-concepts/schemas.md
1414
- `Ack.boolean()`: Creates a `BooleanSchema` for validating booleans.
1515
- `Ack.list(AckSchema itemSchema)`: Creates a `ListSchema` for validating arrays.
1616
- `Ack.object(Map<String, AckSchema> properties)`: Creates an `ObjectSchema` for validating objects.
17-
- `Ack.enumValues(List<T> values)`: Creates an `EnumSchema` for validating enum values.
18-
- `Ack.enumString(List<String> values)`: Creates a string schema that only accepts specific values.
17+
- `Ack.enumValues(List<T> values)`: Creates an `EnumSchema<T>` for Dart enum types. Accepts enum instances, string names, or indices. **Preferred over `enumString` when a Dart enum exists.**
18+
- `Ack.enumString(List<String> values)`: Creates a `StringSchema` constrained to the given values. For ad-hoc string lists without a backing Dart enum.
1919
- `Ack.anyOf(List<AckSchema> schemas)`: Creates an `AnyOfSchema` for union types.
2020
- `Ack.any()`: Creates an `AnySchema` that accepts any value.
2121
- `Ack.discriminated({required String discriminatorKey, required Map<String, AckSchema<Map<String, Object?>>> schemas})`: Creates a discriminated union schema.

docs/core-concepts/schemas.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ final dateSchema = Ack.string().date(); // YYYY-MM-DD
6161
final datetimeSchema = Ack.string().datetime(); // ISO 8601
6262
6363
// Enum values
64-
final roleSchema = Ack.string().enumString(['admin', 'user', 'guest']);
64+
enum Role { admin, user, guest }
65+
final roleSchema = Ack.enumValues(Role.values);
6566
```
6667

6768
### Number

docs/core-concepts/typesafe-schemas.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ After running `dart run build_runner build`, the part file contains:
112112
- `Ack.object(...)`
113113
- Primitive schemas (`Ack.string`, `Ack.integer`, `Ack.double`, `Ack.boolean`)
114114
- Lists of supported schemas (`Ack.list(...)`)
115-
- Literal/enum helpers (`Ack.literal`, `Ack.enumString`, `Ack.enumValues`)
115+
- Literal/enum helpers (`Ack.literal`, `Ack.enumValues`, `Ack.enumString`)
116116

117117
Unsupported helpers include `Ack.any`, `Ack.anyOf`, and `Ack.discriminated`.
118118
Use `@AckModel` for discriminated unions instead.

docs/core-concepts/validation.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ Ack.string().ipv6()
128128

129129

130130
### `enumString(List<String> allowedValues)`
131-
Requires the value to be one of `allowedValues`.
131+
Requires the value to be one of `allowedValues`. Use this only for ad-hoc string lists. When a Dart enum exists, prefer `Ack.enumValues(MyEnum.values)` for type-safe validation.
132132
```dart
133133
Ack.enumString(['active', 'inactive', 'pending'])
134134
```

docs/guides/common-recipes.mdx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,20 +99,16 @@ final postSchema = Ack.object({
9999

100100
## Enum Validation
101101

102-
Validate string values against allowed options:
102+
Validate values against a set of allowed options using Dart enums:
103103

104104
```dart
105-
// Status with specific allowed values
105+
enum OrderStatus { pending, processing, shipped, delivered, cancelled }
106+
enum Priority { low, medium, high }
107+
106108
final orderSchema = Ack.object({
107109
'orderId': Ack.string(),
108-
'status': Ack.string().enumString([
109-
'pending',
110-
'processing',
111-
'shipped',
112-
'delivered',
113-
'cancelled',
114-
]),
115-
'priority': Ack.string().enumString(['low', 'medium', 'high']),
110+
'status': Ack.enumValues(OrderStatus.values),
111+
'priority': Ack.enumValues(Priority.values),
116112
});
117113
118114
// Usage

docs/guides/json-schema-integration.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ final userSchema = Ack.object({
1717
'id': Ack.integer().positive().describe('Unique user identifier'),
1818
'name': Ack.string().minLength(2).maxLength(50).describe('User\'s full name'),
1919
'email': Ack.string().email().describe('User\'s email address'),
20-
'role': Ack.enumString(['admin', 'user', 'guest']).withDefault('user'),
20+
'role': Ack.enumValues(UserRole.values).withDefault(UserRole.user),
2121
'isActive': Ack.boolean().withDefault(true),
2222
'tags': Ack.list(Ack.string()).unique().describe('List of user tags').nullable(),
2323
'age': Ack.integer().min(0).max(120).nullable().describe('User\'s age'),
@@ -217,7 +217,7 @@ Schemas with default values will include them in the generated JSON Schema:
217217

218218
```dart
219219
final configSchema = Ack.object({
220-
'theme': Ack.enumString(['light', 'dark']).withDefault('light'),
220+
'theme': Ack.enumValues(Theme.values).withDefault(Theme.light),
221221
'notifications': Ack.boolean().withDefault(true),
222222
'maxItems': Ack.integer().min(1).max(100).withDefault(10),
223223
});

llms.txt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ Ack.list(itemSchema) // ListSchema<T>
5555
Ack.discriminated(discriminatorKey: ..., schemas: {...}) // DiscriminatedObjectSchema
5656
Ack.anyOf([schema1, schema2]) // AnyOfSchema
5757

58-
// Enum schemas
59-
Ack.enumString(['val1', 'val2']) // StringSchema with enum constraint
60-
Ack.enumValues(MyEnum.values) // EnumSchema<T>
58+
// Enum schemas (prefer enumValues when a Dart enum exists)
59+
Ack.enumValues(MyEnum.values) // EnumSchema<T> - type-safe, preferred
60+
Ack.enumString(['val1', 'val2']) // StringSchema with enum constraint (ad-hoc string lists only)
6161
Ack.literal('exactValue') // StringSchema matching exact value
6262

6363
// Date/Time schemas (with transformation)
@@ -72,7 +72,7 @@ final userSchema = Ack.object({
7272
'name': Ack.string().minLength(2).maxLength(50),
7373
'email': Ack.string().email(),
7474
'age': Ack.integer().min(0).max(120).optional(),
75-
'role': Ack.enumString(['admin', 'user', 'guest']),
75+
'role': Ack.enumValues(UserRole.values),
7676
'active': Ack.boolean(),
7777
});
7878
```
@@ -116,7 +116,7 @@ Ack.string()
116116
.email() // Email format validation
117117
.url() // URL format validation
118118
.matches(r'^[A-Z]+$') // Custom regex pattern
119-
.enumString(['a', 'b']) // Allowed values
119+
.enumString(['a', 'b']) // Allowed string values (prefer Ack.enumValues for Dart enums)
120120
.literal('exact') // Exact value match
121121
```
122122

@@ -146,7 +146,7 @@ Ack.list(Ack.string())
146146
### Default Values
147147

148148
```dart
149-
'status': Ack.enumString(['draft', 'published']).withDefault('draft'),
149+
'status': Ack.enumValues(Status.values).withDefault(Status.draft),
150150
'count': Ack.integer().withDefault(0),
151151
```
152152

@@ -236,8 +236,7 @@ class User {
236236
@Max(150)
237237
final int? age;
238238

239-
@EnumString(['admin', 'user', 'guest'])
240-
final String role;
239+
final UserRole role; // Dart enum fields generate Ack.enumValues automatically
241240

242241
@Pattern(r'^[A-Z]{2}-\d{4}$')
243242
final String code;
@@ -250,7 +249,7 @@ class User {
250249
// 'username': Ack.string().minLength(3).maxLength(50),
251250
// 'email': Ack.string().email(),
252251
// 'age': Ack.integer().min(0).max(150).optional().nullable(),
253-
// 'role': Ack.string().enumString(['admin', 'user', 'guest']),
252+
// 'role': Ack.enumValues(UserRole.values),
254253
// 'code': Ack.string().matches(r'^[A-Z]{2}-\d{4}$'),
255254
// });
256255
```
@@ -721,7 +720,7 @@ dart run build_runner build --delete-conflicting-outputs
721720
| `@Email()` | Email format validation | `@Email()` |
722721
| `@Url()` | URL format validation | `@Url()` |
723722
| `@Pattern(regex)` | Custom regex pattern | `@Pattern(r'^[A-Z]+$')` |
724-
| `@EnumString([...])` | Allowed string values | `@EnumString(['a', 'b'])` |
723+
| `@EnumString([...])` | Allowed string values (prefer Dart enum fields instead) | `@EnumString(['a', 'b'])` |
725724

726725
### Numeric Constraints
727726

0 commit comments

Comments
 (0)