blob: 968b07b26672d456194a8320a6bb0808b8692fcb [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:convert';
import 'nodes.dart';
/// [Parser] parsers a program split constraints json file and returns a
/// [ConstraintData] object.
class Parser {
final Map<String, NamedNode> nameMap = {};
final List<RelativeOrderNode> orderedNodes = [];
void parseReference(Map<String, dynamic> nodeJson) {
var reference = ReferenceNode.fromJson(nodeJson);
nameMap[reference.name] = reference;
}
void parseCombiner(Map<String, dynamic> nodeJson) {
var combinerNode = CombinerNode.fromJson(nodeJson, nameMap);
nameMap[combinerNode.name] = combinerNode;
}
void parseOrder(Map<String, dynamic> nodeJson) {
orderedNodes.add(RelativeOrderNode.fromJson(nodeJson, nameMap));
}
/// Reads a program split constraints json file string and returns a [Nodes]
/// object reflecting the parsed constraints.
ConstraintData read(String programSplitJson) {
List<dynamic> doc = json.decode(programSplitJson);
List<Map<String, dynamic>> referenceConstraints = [];
List<Map<String, dynamic>> combinerConstraints = [];
List<Map<String, dynamic>> orderConstraints = [];
for (Map<String, dynamic> constraint in doc) {
switch (constraint['type']) {
case 'reference':
referenceConstraints.add(constraint);
break;
case 'and':
case 'fuse':
case 'or':
combinerConstraints.add(constraint);
break;
case 'order':
orderConstraints.add(constraint);
break;
default:
throw 'Unrecognized constraint type in $constraint';
}
}
// Parse references, than combiners, than finally sequences.
referenceConstraints.forEach(parseReference);
combinerConstraints.forEach(parseCombiner);
orderConstraints.forEach(parseOrder);
return ConstraintData(nameMap.values.toList(), orderedNodes);
}
}