validateCustomFields function

List<String> validateCustomFields(
  1. Map<String, dynamic>? customFields
)

Validates custom fields according to the Atlas schema Returns a list of error messages if validation fails, empty list if valid

Implementation

List<String> validateCustomFields(Map<String, dynamic>? customFields) {
  if (customFields == null) return [];

  List<String> errors = [];

  customFields.forEach((key, value) {
    // Skip null values as they are allowed
    if (value == null) return;

    // Text field validation
    if (value is String) {
      return;
    }

    // Number field validation
    if (value is num) {
      return;
    }

    // Multi field validation (array of strings)
    if (value is List) {
      if (value.every((item) => item is String)) {
        return;
      }
      errors.add('"$key" must be a list of strings');
      return;
    }

    // URL field validation
    if (value is Map) {
      if (value.containsKey('url') &&
          value.containsKey('title') &&
          value['url'] is String &&
          value['title'] is String) {
        return;
      }

      // Address field validation - all fields are optional
      final addressFields = ['street1', 'street2', 'city', 'state', 'zipCode', 'country'];
      final addressErrors = <String>[];
      for (var field in addressFields) {
        if (value.containsKey(field) && value[field] is! String) {
          addressErrors.add('"$field" must be a string');
        }
      }
      if (addressErrors.isNotEmpty) {
        errors.add('"$key" fields must be strings: ${addressErrors.join(", ")}');
        return;
      }
      if (value.keys.any((key) => addressFields.contains(key))) {
        return;
      }

      errors.add('"$key" has invalid structure. Expected format:\n'
          '\tFor URL: {"url": "string", "title": "string"}\n'
          '\tFor Address: {"street1": "string", "street2": "string", "city": "string", "state": "string", "zipCode": "string", "country": "string"}');
      return;
    }

    errors.add('"$key" has invalid type: ${value.runtimeType}');
  });

  return errors;
}