tryParse static method
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,
);
}