Skip to content

Commit 2bfd2f9

Browse files
committed
Load types lazily
1 parent 573c8e9 commit 2bfd2f9

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

src/anchorpy/coder/types.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)