safeEnumFromJson<T extends Enum> function

T? safeEnumFromJson<T extends Enum>(
  1. String? value,
  2. List<T> enumValues, {
  3. T? defaultValue,
  4. void onUnknownValue(
    1. String unknownValue
    )?,
})

Safely deserialize an enum from a JSON string value.

Handles unknown enum values by returning null or a default value based on the strategy chosen.

Parameters:

  • value: The string value from JSON
  • enumValues: List of all possible enum values (use EnumType.values)
  • defaultValue: Value to return for unknown strings (if null, returns null)
  • onUnknownValue: Optional callback for logging unknown values

Returns: The matched enum value, defaultValue, or null

Example:

extension PostStatusExtension on PostStatus {
  static PostStatus? deserialize(String? value) {
    return safeEnumFromJson(
      value,
      PostStatus.values,
      defaultValue: PostStatus.draft,
      onUnknownValue: (v) => logw('Unknown PostStatus: $v'),
    );
  }
}

Implementation

T? safeEnumFromJson<T extends Enum>(
  String? value,
  List<T> enumValues, {
  T? defaultValue,
  void Function(String unknownValue)? onUnknownValue,
}) {
  if (value == null) return null;

  try {
    // Try to find matching enum by name
    return enumValues.firstWhere(
      (e) => e.name == value,
      orElse: () => throw Exception('Unknown enum value: $value'),
    );
  } catch (e) {
    // Unknown value encountered
    if (onUnknownValue != null) {
      onUnknownValue(value);
    }
    return defaultValue;
  }
}