tryParse static method

MissionMessage? tryParse(
  1. Map<String, dynamic> json
)

Defensive parse. Null ONLY when mission_id is missing / not a non-empty string (nothing can be reported back for such a frame). A malformed step yields a mission with invalidStepIndex set.

Implementation

static MissionMessage? tryParse(Map<String, dynamic> json) {
  final id = json['mission_id'];
  if (id is! String || id.isEmpty) return null;
  final goal = json['goal'] is String ? json['goal'] as String : null;
  final rawSteps = json['steps'];
  final steps = <MissionStep>[];
  int? invalid;
  if (rawSteps != null && rawSteps is! List) {
    invalid = 0;
  } else if (rawSteps is List) {
    for (var i = 0; i < rawSteps.length; i++) {
      final s = rawSteps[i];
      try {
        if (s is! Map) throw const FormatException('step is not an object');
        steps.add(MissionStep.fromJson(Map<String, dynamic>.from(s)));
      } catch (_) {
        invalid = i;
        break;
      }
    }
  }
  return MissionMessage(
    missionId: id,
    goal: goal,
    steps: invalid == null ? steps : const [],
    continueOnFailure: json['continue_on_failure'] == true,
    invalidStepIndex: invalid,
    declaredStepCount: rawSteps is List ? rawSteps.length : 0,
  );
}