BloomRpcValidationErrors.fromResponse constructor

BloomRpcValidationErrors.fromResponse(
  1. dynamic data
)

Parses validation errors from decoded response JSON or error maps.

Supports:

  • {"errors": {"field": ["msg"]}}
  • {"field": "msg", "non_field_errors": ["general error"]}
  • {"error": "message"} or {"detail": "message"}

Implementation

factory BloomRpcValidationErrors.fromResponse(dynamic data) {
  final fieldMap = <String, List<String>>{};
  final generalList = <String>[];

  if (data is Map) {
    dynamic targetMap = data;
    if (data.containsKey('errors') && data['errors'] is Map) {
      targetMap = data['errors'];
    } else if (data.containsKey('validation_errors') &&
        data['validation_errors'] is Map) {
      targetMap = data['validation_errors'];
    }

    for (final entry in (targetMap as Map).entries) {
      final key = entry.key.toString();
      final value = entry.value;

      if (key == 'non_field_errors' ||
          key == '__all__' ||
          key == 'general' ||
          key == 'error' ||
          key == 'detail' ||
          key == 'message') {
        if (value is Iterable) {
          generalList.addAll(value.map((v) => v.toString()));
        } else if (value != null) {
          generalList.add(value.toString());
        }
      } else {
        final list = fieldMap.putIfAbsent(key, () => []);
        if (value is Iterable) {
          list.addAll(value.map((v) => v.toString()));
        } else if (value != null) {
          list.add(value.toString());
        }
      }
    }
  } else if (data is String && data.isNotEmpty) {
    generalList.add(data);
  }

  return BloomRpcValidationErrors(
    fieldErrors: fieldMap,
    nonFieldErrors: generalList,
  );
}