fromConfig static method

String? Function(String?)? fromConfig(
  1. Map<String, dynamic>? validateConfig,
  2. String fieldName, {
  3. Map<String, dynamic>? formData,
})

Creates a validator function from Form.io validation config.

Parses the component's validate object and returns a combined validator. For cross-field validation, pass the form data context.

Example validate config:

{
  "required": true,
  "minLength": 3,
  "maxLength": 50,
  "pattern": "^[A-Za-z]+$"
}

Implementation

static String? Function(String?)? fromConfig(
  Map<String, dynamic>? validateConfig,
  String fieldName, {
  Map<String, dynamic>? formData,
}) {
  if (validateConfig == null || validateConfig.isEmpty) {
    return null;
  }

  return (String? value) {
    final validators = <String? Function()>[];

    // Required
    if (validateConfig['required'] == true || validateConfig['required'] == 'true') {
      validators.add(() => required(value, fieldName: fieldName));
    }

    // String length
    if (validateConfig['minLength'] != null) {
      final min = validateConfig['minLength'] is int ? validateConfig['minLength'] as int : int.tryParse(validateConfig['minLength'].toString()) ?? 0;
      if (min > 0) {
        validators.add(() => minLength(value, min, fieldName: fieldName));
      }
    }

    if (validateConfig['maxLength'] != null) {
      final max = validateConfig['maxLength'] is int ? validateConfig['maxLength'] as int : int.tryParse(validateConfig['maxLength'].toString()) ?? 0;
      if (max > 0) {
        validators.add(() => maxLength(value, max, fieldName: fieldName));
      }
    }

    // Word count
    if (validateConfig['minWords'] != null) {
      final min = validateConfig['minWords'] is int ? validateConfig['minWords'] as int : int.tryParse(validateConfig['minWords'].toString()) ?? 0;
      if (min > 0) {
        validators.add(() => minWords(value, min, fieldName: fieldName));
      }
    }

    if (validateConfig['maxWords'] != null) {
      final max = validateConfig['maxWords'] is int ? validateConfig['maxWords'] as int : int.tryParse(validateConfig['maxWords'].toString()) ?? 0;
      if (max > 0) {
        validators.add(() => maxWords(value, max, fieldName: fieldName));
      }
    }

    // Pattern
    if (validateConfig['pattern'] != null) {
      final patternStr = validateConfig['pattern'].toString();
      if (patternStr.isNotEmpty) {
        validators.add(() => pattern(value, patternStr));
      }
    }

    // Cross-field validation - matchField
    if (validateConfig['matchField'] != null && formData != null) {
      final matchFieldKey = validateConfig['matchField'].toString();
      validators.add(() => matchField(
            value,
            formData[matchFieldKey],
            fieldName,
            matchFieldKey,
          ));
    }

    return combine(validators);
  };
}