99from functools import cached_property
1010from math import ceil
1111from pathlib import Path
12- from typing import TYPE_CHECKING , Annotated , Any , NotRequired , TypeAlias , cast
12+ from typing import TYPE_CHECKING , Annotated , Any , Callable , NotRequired , TypeAlias , cast
1313from typing import Literal as L
1414
15- from pydantic import AfterValidator , BaseModel , BeforeValidator , PlainSerializer
15+ from pydantic import AfterValidator , BaseModel , BeforeValidator , WrapSerializer
1616from pydantic_core .core_schema import SerializationInfo
1717from typing_extensions import TypeAliasType , TypedDict
1818
@@ -44,12 +44,11 @@ def _validate_v2_hash(value: bytes | list[bytes]) -> list[bytes]:
4444 return value
4545
4646
47- def _serialize_v2_hash (value : list [bytes ], info : SerializationInfo ) -> bytes | str | list [str ]:
47+ def _serialize_v2_hash (
48+ value : list [SHA256Hash ], handler : Callable , info : SerializationInfo
49+ ) -> bytes | list [str ]:
50+ ret = handler (value )
4851 if info .context and info .context .get ("mode" ) == "print" :
49- ret = [v .hex () if isinstance (v , bytes ) else v for v in value ]
50-
51- if info .context .get ("hash_truncate" ):
52- ret = [v [0 :8 ] for v in ret ]
5352 return ret
5453 else :
5554 return b"" .join (value )
@@ -66,7 +65,7 @@ def _sort_keys(value: dict) -> dict:
6665
6766
6867PieceLayerItem = Annotated [
69- list [SHA256Hash ], BeforeValidator (_validate_v2_hash ), PlainSerializer (_serialize_v2_hash )
68+ list [SHA256Hash ], BeforeValidator (_validate_v2_hash ), WrapSerializer (_serialize_v2_hash )
7069]
7170PieceLayersType = dict [SHA256Hash , PieceLayerItem ]
7271FileTreeItem = TypedDict ("FileTreeItem" , {"length" : int , "pieces root" : NotRequired [SHA256Hash ]})
0 commit comments