Best way to print MCInst mnemonic and operands individually?

Is there an easy to way to get the printing of an MCInstr such that I can split out the MCOperands and the mnemonic ?

So far I have come up with the following code snippet:

  const llvm::MCContext &Ctx = getContext(); 
  const llvm::MCAsmInfo *MAI = Ctx.getAsmInfo();
  const llvm::MCRegisterInfo *MRI = Ctx.getRegisterInfo();
  const llvm::Triple &TheTriple = Ctx.getTargetTriple();

  std::string Error;
  const Target *Target = TargetRegistry::lookupTarget(TheTriple.str(), Error);
  unsigned AsmVariant = 0; // typically 0 for the default assembly variant
  
  std::unique_ptr<const MCInstrInfo> MII(Target->createMCInstrInfo());
  std::unique_ptr<llvm::MCInstPrinter> Printer(Target->createMCInstPrinter(TheTriple, AsmVariant, *MAI, *MII, *MRI));

  Printer->printInst(&Inst, 0, "", STI, dbgs());

This prints out the assembly nicely as single whole lines but I’d love to be able to capture them individually as I am storing them in a structure.

Bonus points: I’m trying to find a way also for MCFixup to have a reference to the operand it needs to fixup rather than merely the offset.

Not the best solution but I’m doing:

 const char *Mnemonic = Printer->getMnemonic(&Inst).first;
  std::string InstructionStr;
  raw_string_ostream SS(InstructionStr);
  Printer->printInst(&Inst, 0, "", STI, SS);

  // TODO(fzakaria): really bad way to get the OpStr. Find better way?
  // idealy we should have Printer return a string rather than write to an
  // ostream
  StringRef OpStr =
      StringRef(InstructionStr).split("\t").second.split("\t").second;

  LLVM_DEBUG(dbgs() << Mnemonic << "\n");
  LLVM_DEBUG(dbgs() << OpStr << "\n");