validate
ValidationResult<
- dynamic value
Implementation
@override
ValidationResult<T> validate(dynamic value) {
if (value == null) {
return const Invalid({
'body': ['is required']
});
}
Map<String, dynamic> map;
if (value is Map<String, dynamic>) {
map = value;
} else if (value is JSObject) {
// Convert JS object to Dart map
map = (value.dartify() as Map).cast<String, dynamic>();
} else {
return const Invalid({
'body': ['must be an object']
});
}
final errors = <String, List<String>>{};
final validated = <String, dynamic>{};
for (final entry in fields.entries) {
final fieldName = entry.key;
final validator = entry.value;
final fieldValue = map[fieldName];
final result = validator.validate(fieldValue);
switch (result) {
case Valid(:final value):
validated[fieldName] = value;
case final Invalid invalid:
// Prefix errors with field name
for (final e in invalid.errors.entries) {
final key = e.key == 'value' ? fieldName : '$fieldName.${e.key}';
errors[key] = e.value;
}
}
}
if (errors.isNotEmpty) {
return Invalid(errors);
}
return Valid(constructor(validated));
}