4 def __init__(self) -> None:
7 def print_simple(self, pp, *args):
8 raise NotImplementedError()
10 def print_abstract(self, pp, *args):
11 raise NotImplementedError()
13 def print_detailed(self, pp, *args):
14 raise NotImplementedError()
16 class PrintMode(Enum):
21 class TypeConverter(Enum):
22 Identity = lambda v: v
23 CString = lambda v: v.string()
25 class MyPrettyPrinter:
27 def __init__(self, level = 0, prefix='') -> None:
29 self.__padding = " " * MyPrettyPrinter.INDENT * level
30 self.__prefix = prefix
32 def set_prefix(self, prefix):
33 self.__prefix = prefix
36 def clear_prefix(self):
40 def next_level(self, indent_inc = 1):
41 return MyPrettyPrinter(indent_inc + self.__level, self.__prefix)
43 def print(self, *vals, indent=0, mode=PrintMode.Simple):
44 val = '' if len(vals) == 0 else vals[0]
45 if isinstance(val, PrettyPrintable):
48 pp = self.next_level(indent)
51 val.print_abstract ][mode.value](pp)
54 print(f"{self.__padding}{new_id}", f"{self.__prefix}{val}", *vals[1:])
58 def printf(self, fmt, *args, indent=0):
59 assert isinstance(fmt, str)
60 self.print(fmt%args, indent=indent)
63 def printfa(self, fmt, *args, indent=0):
64 assert isinstance(fmt, str)
65 self.print(fmt.format(*args), indent=indent)
69 def print_field(self, obj, field, fmt=None, val=None, cast=TypeConverter.Identity):
70 val = obj[field] if val is None else val
74 self.printf("%s: %s", field, val)
76 self.printf("%s: %s", field, fmt%(val))