Skip to content

Commit add2ee3

Browse files
Merge pull request #164 from code0-tech/161-false-return-format
REST will return Json instead of ProtoJson
2 parents 5b42dde + 584f3b9 commit add2ee3

1 file changed

Lines changed: 47 additions & 2 deletions

File tree

adapter/rest/src/main.rs

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use hyper::{
1414
server::conn::http1,
1515
};
1616
use hyper_util::rt::TokioIo;
17+
use serde_json::{Map, Number, Value as J};
1718
use std::collections::HashMap;
1819
use std::convert::Infallible;
1920
use 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+
61101
fn 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

Comments
 (0)