hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

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())