@SuppressWarnings("unchecked")
	private boolean processStructMembers(Entry<String, Object> entry, Structure struct)
			throws InvalidDataTypeException {
		boolean processedAll = true;
		Map<String, Object> field = (Map<String, Object>) entry.getValue();
		int offset = (int) (double) field.get("offset");
		Map<String, Object> type = (Map<String, Object>) field.get("type");
		DataType memberDT = findDataType(type);
		if (memberDT != null) {
			processSettings(type, memberDT.getDefaultSettings());
			if (memberDT instanceof Dynamic dynamicDT) {
				if (!dynamicDT.canSpecifyLength()) {
					return false;
				}
			} else if (memberDT.getLength() <= 0) {
				return false;
			}
			String memberName = entry.getKey();
			Boolean noFieldName = (Boolean) field.get("hasNoFieldName");
			if (noFieldName != null && noFieldName) {
				memberName = null;
			}
			String memberComment = (String) field.get("comment");
			int compSize = (int) (double) field.get("length");

			// NOTE: Size consistency checking was removed since some types are filled-out
			// lazily and may not have there ultimate size at this point.

			if (field.get("bitOffset") != null) {
				int bitOffset = (int) (double) field.get("bitOffset");
				int bitSize = (int) (double) field.get("bitSize");
				// NB: we're using "insert" and the team has suggested "add" is a better choice,
				// but, because of the multi-pass approach, I don't think I can guarantee an
				// in-order load.
				DataTypeComponent dtc = struct.insertBitFieldAt(offset, memberDT.getLength(), bitOffset, memberDT,
						bitSize, memberName, memberComment);
				processSettings(field, dtc.getDefaultSettings());
				return processedAll;
			}

			DataTypeComponent dtc;
			if (offset == struct.getLength()) {
				dtc = struct.add(memberDT, compSize, memberName, memberComment);
			} else {
				dtc = struct.replaceAtOffset(offset, memberDT, compSize, memberName, memberComment);
			}

			processSettings(field, dtc.getDefaultSettings());
		} else {
			processedAll = type.get("kind").equals("pointer");
		}
		return processedAll;
	}
Reads the datatypes encoded in SARIF from the specified SARIF parser and
recreates them in a datatype manager.

@param result  the SARIF parser
@param monitor the task monitor
@throws SAXParseException  if an SARIF parse error occurs
@throws CancelledException if the user cancels the read operation
Ghidra/Features/Sarif/src/main/java/sarif/managers/DataTypesSarifMgr.java