@@ -9,22 +9,48 @@ use axum::{
9
9
} ;
10
10
use http:: StatusCode ;
11
11
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 } ;
14
14
use std:: sync:: Arc ;
15
15
use tower_http:: cors:: CorsLayer ;
16
16
17
- #[ derive( Serialize , Deserialize , Debug ) ]
17
+ #[ derive( Deserialize , Debug ) ]
18
18
pub struct ServerResponse < T >
19
19
where
20
20
T : Serialize ,
21
21
{
22
- #[ serde( rename = "type" ) ]
23
22
pub response_type : String ,
24
- #[ serde( flatten) ]
25
23
pub args : T ,
26
24
}
27
25
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
+ }
28
54
impl < T > ServerResponse < T >
29
55
where
30
56
T : Serialize ,
0 commit comments