import gdb from .error_code import KstdErrorCodePrinter class KstdResultPrinter(gdb.ValuePrinter): def __init__(self, val): self.__val = val self.__has_value = bool(val["_M_has_value"]) try: t = val.type.template_argument(0) self.__is_void = t.code == gdb.TYPE_CODE_VOID except (gdb.error, AttributeError): self.__is_void = False @property def _error_code(self): return self.__val["_M_unex"] @property def _value(self): return self.__val["_M_val"] def _format_value(self, gdb_value): printer = gdb.default_visualizer(gdb_value) if printer is not None: return printer.to_string() s = str(gdb_value) if s.startswith("{"): return str(gdb_value.type.strip_typedefs()) return s def _format_error(self, error_code_val): printer = KstdErrorCodePrinter(error_code_val) return printer.to_string() def to_string(self): if not self.__has_value: return f"failure: {self._format_error(self._error_code)}" if self.__is_void: return "success" return f"success: {self._format_value(self._value)}" def children(self): if not self.__has_value: yield ("error", self._error_code) elif not self.__is_void: yield ("value", self._value) def display_hint(self): return None