1import gdb
2
3from typing import Optional, Union
4
5
6class Value(gdb.Value):
7    def __init__(self, value: Union[gdb.Value, 'Value']):
8        super().__init__(value)
9
10    def __getitem__(self, key):
11        try:
12            value = super().__getitem__(key)
13        except gdb.error:
14            value = super().__getattr__(key)
15        return Value(value)
16
17    def __getattr__(self, key):
18        if hasattr(super(), key):
19            return Value(super().__getattribute__(key))
20        return Value(super().__getitem__(key))
21
22    def cast(self, type_name: str | gdb.Type, ptr: bool = False) -> Optional['Value']:
23        try:
24            gdb_type = gdb.lookup_type(type_name) if isinstance(type_name, str) else type_name
25            if ptr:
26                gdb_type = gdb_type.pointer()
27            return Value(super().cast(gdb_type))
28        except gdb.error:
29            return None
30
31    def super_value(self, attr: str) -> 'Value':
32        return self[attr]
33