Skip to main content


The PrinterAPI enables an application to print (or otherwise write) variables and classes in a structured manner.

The default Printer class is yaml-like but not structured. The JsonPrinter class prints properly formed JSON. To support this, the Printer class makes use of structured data principles such as printing objects, arrays, and key-value pairs.

The print_final() is virtual and can be overridden. By default, it writes to the standard output but could be modified to write to a file or web socket or anything.

The Printer class makes heavy usage of the << operator. It provides operators for upstream types such as those defined in VarAPI.

#include <printer.hpp>#include <var.hpp>
Array<u8, 16> datadata.fill(0xff)
Printer pp << data
//any type supporting << can be encapsulated in an objectp.object("dataObject", data)
//or an array (no keys printed)p.array("dataArray", data)

Downstream classes can define the << operator to seamlessly integrate with the printer class. The ChronoAPI does this to print chrono::ClockTime.

namespace printer {Printer & operator<<(Printer &printer, const chrono::ClockTime &a){  printer.key("seconds", var::NumberString(a.seconds())    .key("nanoseconds", var::NumberString(a.nanoseconds())  return printer}} // namespace printer

Now we can do:

JsonPrinter().object("clockTime", ClockTime::get_system_time())

This will give us:

  "clockTime": {    "seconds": 1234,    "nanoseconds": 5678  }