public <T> void markupStructure(StructureContext<T> structureContext, boolean nested)
			throws IOException, CancelledException {
		Address addr = structureContext.getStructureAddress();
		if (!nested && !markedupStructs.add(addr)) {
			return;
		}

		T instance = structureContext.getStructureInstance();
		if (!nested) {
			try {
				Structure structDT = structureContext.getStructureDataType();
				if (structDT.isDeleted()) {
					throw new IOException("Structure mapping data type invalid: " + structDT);
				}
				markupAddress(addr, structDT);
			}
			catch (IOException e) {
				StructureMappingInfo<T> mappingInfo = structureContext.getMappingInfo();
				throw new IOException("Markup failed for structure %s at %s"
						.formatted(mappingInfo.getDescription(), addr),
					e);
			}

			if (instance instanceof StructureMarkup<?> sm) {
				String structureLabel = sm.getStructureLabel();
				String namespaceName = sm.getStructureNamespace();
				if (structureLabel != null && !structureLabel.isBlank()) {
					labelAddress(addr, structureLabel, namespaceName);
				}
			}
		}

		markupFields(structureContext);

		if (instance instanceof StructureMarkup<?> sm) {
			sm.additionalMarkup(this);
		}

	}
Decorates a structure mapped structure, and everything it contains.

@param <T> structure mapped type
@param structureContext {@link StructureContext}
@param nested if true, it is assumed that the Ghidra data types have already been
placed and only markup needs to be performed.
@throws IOException if error marking up structure
@throws CancelledException if cancelled
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/structmapping/MarkupSession.java