@@ -20,15 +20,34 @@ def __init__(self, idl: Idl) -> None:
2020 self .idl = idl
2121 self .types_layouts : Dict [str , Construct ] = {}
2222
23+ self .filtered_types = []
2324 if idl .types :
24- filtered_types = [
25+ self . filtered_types = [
2526 ty for ty in idl .types if not getattr (ty , "generics" , None )
2627 ]
2728
28- for type_def in filtered_types :
29- self .types_layouts [type_def .name ] = _typedef_layout_without_field_name (
30- type_def , idl .types
31- )
29+ def _get_layout (self , name : str ) -> Construct :
30+ """Get or create a layout for a given type name.
31+
32+ Args:
33+ name: The name of the type.
34+
35+ Returns:
36+ The construct layout for the type.
37+
38+ Raises:
39+ ValueError: If the type is not found.
40+ """
41+ if name in self .types_layouts :
42+ return self .types_layouts [name ]
43+
44+ type_defs = [t for t in self .filtered_types if t .name == name ]
45+ if not type_defs :
46+ raise ValueError (f"Unknown type: { name } " )
47+
48+ layout = _typedef_layout_without_field_name (type_defs [0 ], self .idl .types )
49+ self .types_layouts [name ] = layout
50+ return layout
3251
3352 def encode (self , name : str , data : Any ) -> bytes :
3453 """Encode a user-defined type.
@@ -43,10 +62,7 @@ def encode(self, name: str, data: Any) -> bytes:
4362 Raises:
4463 ValueError: If the type is not found.
4564 """
46- layout = self .types_layouts .get (name )
47- if not layout :
48- raise ValueError (f"Unknown type: { name } " )
49-
65+ layout = self ._get_layout (name )
5066 return layout .build (data )
5167
5268 def decode (self , name : str , buffer : bytes ) -> Container [Any ]:
@@ -62,8 +78,5 @@ def decode(self, name: str, buffer: bytes) -> Container[Any]:
6278 Raises:
6379 ValueError: If the type is not found.
6480 """
65- layout = self .types_layouts .get (name )
66- if not layout :
67- raise ValueError (f"Unknown type: { name } " )
68-
81+ layout = self ._get_layout (name )
6982 return layout .parse (buffer )
0 commit comments