33
44import copy
55import io
6- from typing import TYPE_CHECKING , TypeVar , cast
6+ from typing import TYPE_CHECKING , Generic , TypeVar , cast
77
88from pcapkit .corekit .fields .field import _Field
99from pcapkit .corekit .multidict import OrderedMultiDict
2525 from pcapkit .protocols .schema .schema import Schema
2626
2727_TL = TypeVar ('_TL' , 'Schema' , '_Field' , 'bytes' )
28+ _TS = TypeVar ('_TS' , bound = 'Schema' )
2829
2930
30- class ListField (_Field [List [_TL ]]):
31+ class ListField (_Field [List [_TL ]], Generic [ _TL ] ):
3132 """Field list for protocol fields.
3233
3334 Args:
@@ -160,7 +161,7 @@ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'byte
160161 return temp
161162
162163
163- class OptionField (ListField ):
164+ class OptionField (ListField , Generic [ _TS ] ):
164165 """Field list for protocol options.
165166
166167 Args:
@@ -181,7 +182,7 @@ class OptionField(ListField):
181182 """
182183
183184 @property
184- def base_schema (self ) -> 'Type[Schema ]' :
185+ def base_schema (self ) -> 'Type[_TS ]' :
185186 """Base schema."""
186187 return self ._base_schema
187188
@@ -191,7 +192,7 @@ def type_name(self) -> 'str':
191192 return self ._type_name
192193
193194 @property
194- def registry (self ) -> 'defaultdict[int | StdlibEnum | AenumEnum, Type[Schema ]]' :
195+ def registry (self ) -> 'defaultdict[int | StdlibEnum | AenumEnum, Type[_TS ]]' :
195196 """Option registry."""
196197 return self ._registry
197198
@@ -206,9 +207,9 @@ def option_padding(self) -> 'int':
206207 return self ._option_padding
207208
208209 def __init__ (self , length : 'int | Callable[[dict[str, Any]], int]' = lambda _ : - 1 ,
209- base_schema : 'Optional[Type[Schema ]]' = None ,
210+ base_schema : 'Optional[Type[_TS ]]' = None ,
210211 type_name : 'str' = 'type' ,
211- registry : 'Optional[defaultdict[int | StdlibEnum | AenumEnum, Type[Schema ]]]' = None ,
212+ registry : 'Optional[defaultdict[int | StdlibEnum | AenumEnum, Type[_TS ]]]' = None ,
212213 eool : 'Optional[int | StdlibEnum | AenumEnum]' = None ,
213214 callback : 'Callable[[Self, dict[str, Any]], None]' = lambda * _ : None ) -> 'None' :
214215 super ().__init__ (length , None , callback )
@@ -228,7 +229,7 @@ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: -
228229 raise FieldValueError ('Field <option> has no registry.' )
229230 self ._registry = registry
230231
231- def unpack (self , buffer : 'bytes | IO[bytes]' , packet : 'dict[str, Any]' ) -> 'list[Schema ]' :
232+ def unpack (self , buffer : 'bytes | IO[bytes]' , packet : 'dict[str, Any]' ) -> 'list[_TS ]' :
232233 """Unpack field value from :obj:`bytes`.
233234
234235 Args:
@@ -256,7 +257,7 @@ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'list
256257 new_packet = packet .copy ()
257258 new_packet [self .name ] = OrderedMultiDict ()
258259
259- temp = [] # type: list[Schema ]
260+ temp = [] # type: list[_TS ]
260261 while length > 0 :
261262 # unpack option type using base schema
262263 meta = self ._base_schema .unpack (file , length , packet ) # type: ignore[call-arg,misc,var-annotated]
0 commit comments