validate method

List<ValidationError> validate(
  1. JsonValue value, {
  2. bool isUpdate = false,
})

Validates the field value based on the defined validation rules.

Implementation

List<ValidationError> validate(
  JsonValue value, {
  bool isUpdate = false,
}) {
  final errors = <ValidationError>[];

  if (cardinality.isRequired) {
    //Check for null
    if (value is JsonNull) {
      errors.add(
        ValidationError(
          message: 'Field $name is required, but null was specified',
          field: name,
        ),
      );
    } else {
      if (!isUpdate && value is Undefined) {
        errors.add(
          ValidationError(
            message: 'Field $name is required, but no value was specified',
            field: name,
          ),
        );
      }
    }
  }

  if ((min != null || max != null) && value is! JsonArray) {
    errors.add(
      ValidationError(
        message: 'Field $name must be an array',
        field: name,
      ),
    );
  }

  if (min != null && value is JsonArray && value.length < min!) {
    errors.add(
      ValidationError(
        message: 'Field $name must have at least $min items',
        field: name,
      ),
    );
  }

  if (max != null && value is JsonArray && value.length > max!) {
    errors.add(
      ValidationError(
        message: 'Field $name must have at most $max items',
        field: name,
      ),
    );
  }

  if (regex != null) {
    if (value is! JsonString) {
      if (value.isSome) {
        errors.add(
          ValidationError(
            message: 'Field $name must be a string and '
                'match the regex expression',
            field: name,
          ),
        );
      }
    } else {
      if (!RegExp(regex!).hasMatch(value.value)) {
        errors.add(
          ValidationError(
            message: 'Field $name must match the pattern $regex',
            field: name,
          ),
        );
      }
    }
  }

  if (allowedStringValues.isNotEmpty) {
    if (value is! JsonString) {
      if (value.isSome) {
        errors.add(
          ValidationError(
            message: 'Field $name must be a string',
            field: name,
          ),
        );
      }
    } else {
      if (!allowedStringValues.contains(value.value)) {
        errors.add(
          ValidationError(
            message: 'Field $name value must be one of '
                '[ ${allowedStringValues.join(', ')} ]',
            field: name,
          ),
        );
      }
    }
  }

  return errors;
}