1
- from typing import Dict , Any , List
1
+ from typing import Dict , Any , List , Type , Protocol , cast
2
2
from .common import *
3
3
from .models import *
4
4
import logging
5
5
6
+
7
+ # Protocol to define classes with from_dict method
8
+ class FromDictProtocol (Protocol ):
9
+ @classmethod
10
+ def from_dict (cls , data : Dict [str , Any ]) -> "FromDictProtocol" :
11
+ pass
12
+
13
+
6
14
# Define the mapping of market and event type to model class
7
- MARKET_EVENT_MAP = {
15
+ MARKET_EVENT_MAP : Dict [ Market , Dict [ str , Type [ FromDictProtocol ]]] = {
8
16
Market .Stocks : {
9
17
"A" : EquityAgg ,
10
18
"AM" : EquityAgg ,
50
58
}
51
59
52
60
53
- def parse_single (data : Dict [str , Any ], market : Market , logger : logging .Logger ) -> Any :
61
+ def parse_single (
62
+ data : Dict [str , Any ], logger : logging .Logger , market : Market
63
+ ) -> Optional [WebSocketMessage ]:
54
64
event_type = data ["ev" ]
55
65
# Look up the model class based on market and event type
56
66
model_class : Optional [Type [FromDictProtocol ]] = MARKET_EVENT_MAP .get (
57
67
market , {}
58
68
).get (event_type )
59
69
if model_class :
60
- return model_class .from_dict (data )
70
+ parsed = model_class .from_dict (data )
71
+ return cast (
72
+ WebSocketMessage , parsed
73
+ ) # Ensure the return type is WebSocketMessage
61
74
else :
62
75
# Log a warning for unrecognized event types, unless it's a status message
63
76
if event_type != "status" :
@@ -70,7 +83,7 @@ def parse(
70
83
) -> List [WebSocketMessage ]:
71
84
res = []
72
85
for m in msg :
73
- parsed = parse_single (m , market )
86
+ parsed = parse_single (m , logger , market )
74
87
if parsed is None :
75
88
if m ["ev" ] != "status" :
76
89
logger .warning ("could not parse message %s" , m )
0 commit comments