@@ -14,6 +14,7 @@ use hyper::{
1414 server:: conn:: http1,
1515} ;
1616use hyper_util:: rt:: TokioIo ;
17+ use serde_json:: { Map , Number , Value as J } ;
1718use std:: collections:: HashMap ;
1819use std:: convert:: Infallible ;
1920use std:: net:: SocketAddr ;
@@ -58,6 +59,45 @@ fn json_error(status: StatusCode, msg: &str) -> Response<Full<Bytes>> {
5859 . unwrap ( )
5960}
6061
62+ fn pb_value_to_json ( v : & Value ) -> serde_json:: Value {
63+ match v. kind . as_ref ( ) {
64+ None => J :: Null ,
65+
66+ Some ( Kind :: NullValue ( _) ) => J :: Null ,
67+
68+ Some ( Kind :: BoolValue ( b) ) => J :: Bool ( * b) ,
69+
70+ Some ( Kind :: StringValue ( s) ) => J :: String ( s. clone ( ) ) ,
71+
72+ Some ( Kind :: NumberValue ( n) ) => {
73+ if let Some ( num) = Number :: from_f64 ( * n) {
74+ J :: Number ( num)
75+ } else if n. is_nan ( ) {
76+ J :: String ( "NaN" . to_string ( ) )
77+ } else if n. is_infinite ( ) {
78+ if n. is_sign_positive ( ) {
79+ J :: String ( "Infinity" . to_string ( ) )
80+ } else {
81+ J :: String ( "-Infinity" . to_string ( ) )
82+ }
83+ } else {
84+ // Fallback for unexpected cases where from_f64 returns None.
85+ J :: Null
86+ }
87+ }
88+
89+ Some ( Kind :: ListValue ( lv) ) => J :: Array ( lv. values . iter ( ) . map ( pb_value_to_json) . collect ( ) ) ,
90+
91+ Some ( Kind :: StructValue ( st) ) => {
92+ let mut obj = Map :: new ( ) ;
93+ for ( k, v) in & st. fields {
94+ obj. insert ( k. clone ( ) , pb_value_to_json ( v) ) ;
95+ }
96+ J :: Object ( obj)
97+ }
98+ }
99+ }
100+
61101fn build_response (
62102 status : StatusCode ,
63103 headers : HashMap < String , String > ,
@@ -210,8 +250,13 @@ async fn execute_flow_to_hyper_response(
210250 } ;
211251
212252 // payload -> json bytes
213- let json = serde_json:: to_vec_pretty ( payload_val) . unwrap_or_else ( |err| {
214- format ! ( r#"{{"error":"Serialization failed: {}"}}"# , err) . into_bytes ( )
253+ let json_val = pb_value_to_json ( payload_val) ;
254+ let json = serde_json:: to_vec_pretty ( & json_val) . unwrap_or_else ( |err| {
255+ let fallback = serde_json:: json!( {
256+ "error" : format!( "Serialization failed: {}" , err) ,
257+ } ) ;
258+ serde_json:: to_vec ( & fallback)
259+ . unwrap_or_else ( |_| br#"{"error":"Serialization failed"}"# . to_vec ( ) )
215260 } ) ;
216261
217262 let status =
0 commit comments