Skip to content

Commit 3f08aa4

Browse files
authored
fix: only flatten args when possible (#108)
1 parent 8a4e779 commit 3f08aa4

File tree

1 file changed

+31
-5
lines changed
  • integrationos-api/src/router

1 file changed

+31
-5
lines changed

integrationos-api/src/router/mod.rs

+31-5
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,48 @@ use axum::{
99
};
1010
use http::StatusCode;
1111
use integrationos_domain::TimedExt;
12-
use serde::{Deserialize, Serialize};
13-
use serde_json::json;
12+
use serde::{ser::SerializeMap, Deserialize, Serialize, Serializer};
13+
use serde_json::{json, Value};
1414
use std::sync::Arc;
1515
use tower_http::cors::CorsLayer;
1616

17-
#[derive(Serialize, Deserialize, Debug)]
17+
#[derive(Deserialize, Debug)]
1818
pub struct ServerResponse<T>
1919
where
2020
T: Serialize,
2121
{
22-
#[serde(rename = "type")]
2322
pub response_type: String,
24-
#[serde(flatten)]
2523
pub args: T,
2624
}
2725

26+
impl<T> Serialize for ServerResponse<T>
27+
where
28+
T: Serialize,
29+
{
30+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
31+
where
32+
S: Serializer,
33+
{
34+
let args_value = match serde_json::to_value(&self.args) {
35+
Ok(value) => value,
36+
Err(_) => return Err(serde::ser::Error::custom("Serialization of args failed")),
37+
};
38+
39+
if let Value::Object(ref args_map) = args_value {
40+
let mut state = serializer.serialize_map(None)?;
41+
42+
state.serialize_entry("type", &self.response_type)?;
43+
44+
for (key, value) in args_map {
45+
state.serialize_entry(key, value)?;
46+
}
47+
48+
state.end()
49+
} else {
50+
self.args.serialize(serializer)
51+
}
52+
}
53+
}
2854
impl<T> ServerResponse<T>
2955
where
3056
T: Serialize,

0 commit comments

Comments
 (0)