validate method

  1. @override
JarResult validate(
  1. Map<String, dynamic>? value, [
  2. Map<String, dynamic>? allValues
])
override

Implementation

@override
JarResult validate(Map<String, dynamic>? value,
    [Map<String, dynamic>? allValues]) {
  final baseResult = super.validate(value, allValues ?? value);
  if (!baseResult.isValid) {
    return baseResult;
  }

  if (fields.isEmpty || value == null) {
    return JarResult.success();
  }

  final ignoredFields = _ignoredFields ?? [];

  if (!_allowExtra) {
    final extraFields = value.keys
        .where(
            (key) => !fields.containsKey(key) && !ignoredFields.contains(key))
        .toList();

    if (extraFields.isNotEmpty) {
      return JarResult.error(
          'Extra fields are not allowed: ${extraFields.join(", ")}');
    }
  }

  final errors = [];

  fields.forEach((key, fieldSchema) {
    final fieldValue = value[key];

    if (fieldSchema is JarObject && fieldValue is Map<String, dynamic>) {
      final nestedResult = fieldSchema.validate(fieldValue, value);
      if (!nestedResult.isValid) {
        if (nestedResult.details != null &&
            nestedResult.details!.containsKey('errors')) {
          final nestedErrors = nestedResult.details!['errors'];
          for (var error in nestedErrors) {
            errors.add({
              'path': '$key.${error['path']}',
              'message': error['message'],
            });
          }
        } else {
          errors.add({
            'path': key,
            'message': nestedResult.error,
          });
        }
      }
    } else {
      final fieldResult = fieldSchema.validate(fieldValue, value);
      if (!fieldResult.isValid) {
        errors.add({
          'path': key,
          'message': fieldResult.error,
        });
      }
    }
  });

  if (errors.isNotEmpty) {
    return JarResult.error('Validation failed', {'errors': errors});
  }

  return JarResult.success();
}