codec.mojo (1786B)
1 from std.collections import Optional 2 3 from json import Value, dumps, loads 4 5 from hyf_stdio.envelope import ( 6 WireErrorResponse, 7 WireRequest, 8 WireSuccessResponse, 9 ) 10 11 12 @fieldwise_init 13 struct RequestCorrelation(Copyable, Movable): 14 var request_id: String 15 var trace_id: Optional[String] 16 17 18 def _extract_optional_string(value: Value, key: String) -> Optional[String]: 19 if not value.is_object(): 20 return None 21 22 for candidate in value.object_keys(): 23 if candidate == key: 24 try: 25 var field_value = value[key] 26 if field_value.is_string(): 27 return String(field_value.string_value()) 28 except e: 29 pass 30 return None 31 return None 32 33 34 def decode_request(line: String) raises -> WireRequest: 35 if line == "": 36 raise Error("request line must not be empty") 37 38 var json = loads(line) 39 return WireRequest.from_json(json) 40 41 42 def extract_request_correlation(line: String) -> RequestCorrelation: 43 var request_id = String() 44 var trace_id: Optional[String] = None 45 46 if line == "": 47 return RequestCorrelation(request_id=request_id, trace_id=trace_id^) 48 49 try: 50 var json = loads(line) 51 var extracted_request_id = _extract_optional_string(json, "request_id") 52 if extracted_request_id: 53 request_id = extracted_request_id.value() 54 55 trace_id = _extract_optional_string(json, "trace_id") 56 except e: 57 pass 58 59 return RequestCorrelation(request_id=request_id, trace_id=trace_id^) 60 61 62 def encode_success(response: WireSuccessResponse) raises -> String: 63 return dumps(response.to_json_value()) 64 65 66 def encode_error(response: WireErrorResponse) raises -> String: 67 return dumps(response.to_json_value())