public static boolean isRust(Program program, MemoryBlock block, TaskMonitor monitor)
			throws IOException, CancelledException {
		if (block == null) {
			return false;
		}

		// Use a MemoryBytePatternSearch for more efficient byte searching over a list of potential
		// byte signatures. The below action sets our supplied boolean to true on a match, which we
		// can later query and use as a return value for this method.
		GenericMatchAction<AtomicBoolean> action =
			new GenericMatchAction<AtomicBoolean>(new AtomicBoolean()) {
			@Override
			public void apply(Program prog, Address addr, Match match) {
				getMatchValue().set(true);
			}
		};
		MemoryBytePatternSearcher searcher = new MemoryBytePatternSearcher("Rust signatures");
		for (byte[] sig : RustConstants.RUST_SIGNATURES) {
			searcher.addPattern(new GenericByteSequencePattern<AtomicBoolean>(sig, action));
		}

		searcher.search(program, new AddressSet(block.getAddressRange()), monitor);

		return action.getMatchValue().get();
	}
Checks if a given {@link MemoryBlock} contains a Rust signature
<p>
This may be used by loaders to determine if a program was compiled with rust.
If the program is determined to be rust, then the compiler property is set to
{@link RustConstants#RUST_COMPILER}.

@param program The {@link Program}
@param block The {@link MemoryBlock} to scan for Rust signatures
@param monitor The monitor
@return True if the given {@link MemoryBlock} is not null and contains a Rust signature; 
  otherwise, false
@throws IOException if there was an IO-related error
@throws CancelledException if the user cancelled the operation
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/rust/RustUtilities.java