@@ -88,7 +88,42 @@ def to_dict(self) -> dict[str, Any]:
8888
8989 @classmethod
9090 def from_dict (cls , d : dict [str , Any ]) -> TransportMessage :
91- """Deserialize from a wire format dict."""
91+ """Deserialize from a wire format dict.
92+
93+ Raises ``TypeError`` if required fields have wrong types.
94+ """
95+ required_str = {"id" : "id" , "from" : "from" , "streamId" : "streamId" }
96+ for wire_key , label in required_str .items ():
97+ if wire_key not in d :
98+ raise KeyError (f"Missing required field: { label } " )
99+ if not isinstance (d [wire_key ], str ):
100+ raise TypeError (
101+ f"Field '{ label } ' must be str, "
102+ f"got { type (d [wire_key ]).__name__ } "
103+ )
104+
105+ required_int = {"seq" : "seq" , "ack" : "ack" }
106+ for wire_key , label in required_int .items ():
107+ if wire_key not in d :
108+ raise KeyError (f"Missing required field: { label } " )
109+ if not isinstance (d [wire_key ], int ):
110+ raise TypeError (
111+ f"Field '{ label } ' must be int, "
112+ f"got { type (d [wire_key ]).__name__ } "
113+ )
114+
115+ if "to" not in d :
116+ raise KeyError ("Missing required field: to" )
117+ if "payload" not in d :
118+ raise KeyError ("Missing required field: payload" )
119+
120+ control_flags = d .get ("controlFlags" , 0 )
121+ if not isinstance (control_flags , int ):
122+ raise TypeError (
123+ f"Field 'controlFlags' must be int, "
124+ f"got { type (control_flags ).__name__ } "
125+ )
126+
92127 return cls (
93128 id = d ["id" ],
94129 from_ = d ["from" ],
@@ -97,7 +132,7 @@ def from_dict(cls, d: dict[str, Any]) -> TransportMessage:
97132 ack = d ["ack" ],
98133 payload = d ["payload" ],
99134 stream_id = d ["streamId" ],
100- control_flags = d . get ( "controlFlags" , 0 ) ,
135+ control_flags = control_flags ,
101136 service_name = d .get ("serviceName" ),
102137 procedure_name = d .get ("procedureName" ),
103138 tracing = d .get ("tracing" ),
0 commit comments