flagBitsFromJson function

ByteData flagBitsFromJson(
  1. Object? json_,
  2. Flags spec
)

Converts a JSON object to a ByteData containing the flag bits.

Implementation

ByteData flagBitsFromJson(Object? json_, Flags spec) {
  final numBytes = num_i32_flags(spec.labels) * 4;
  final flagBits = ByteData(numBytes);

  if (json_ is Map) {
    json_.forEach((k, v) {
      final index = spec.labels.indexOf(k as String);
      if (index == -1) throw Exception('Invalid flag $k: $v');
      if (v == true || v == 1) {
        final u32Index = index ~/ 32;
        final current = flagBits.getUint32(u32Index, Endian.little);
        flagBits.setUint32(
          u32Index,
          current | (math.pow(2, index % 32) as int),
          Endian.little,
        );
      }
    });
    return flagBits;
  } else {
    final json = (json_! as List).cast<int>();
    if (json.length != (numBytes ~/ 4)) {
      throw Exception('Invalid flag list length: $json');
    }
    for (var i = 0; i < json.length; i++) {
      flagBits.setUint32(i * 4, json[i], Endian.little);
    }
    return flagBits;
  }
}