8
8
import com .javadiscord .jdi .internal .api .DiscordResponseFuture ;
9
9
10
10
import java .util .List ;
11
+ import java .util .Map ;
11
12
12
13
public class DiscordResponseParser {
13
14
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper ();
@@ -21,25 +22,60 @@ public <T> AsyncResponse<List<T>> callAndParseList(Class<T> clazz, DiscordReques
21
22
AsyncResponse <List <T >> asyncResponse = new AsyncResponse <>();
22
23
DiscordResponseFuture future = dispatcher .queue (request );
23
24
future .onSuccess (
24
- res -> {
25
- try {
26
- List <T > resultList = parseResponse (clazz , res .body ());
27
- asyncResponse .setResult (resultList );
28
- } catch (Exception e ) {
29
- asyncResponse .setException (e );
25
+ response -> {
26
+ if (isSuccessfulResponse (response )) {
27
+ try {
28
+ List <T > resultList = parseResponseFromList (clazz , response .body ());
29
+ asyncResponse .setResult (resultList );
30
+ } catch (Exception e ) {
31
+ asyncResponse .setException (e );
32
+ }
33
+ } else {
34
+ asyncResponse .setException (errorResponseException (response ));
30
35
}
31
36
});
32
37
future .onError (asyncResponse ::setException );
33
38
return asyncResponse ;
34
39
}
35
40
36
- private <T > List <T > parseResponse (Class <T > elementType , String response )
41
+ public <T > AsyncResponse <List <T >> callAndParseMap (String key , DiscordRequest request ) {
42
+ AsyncResponse <List <T >> asyncResponse = new AsyncResponse <>();
43
+ DiscordResponseFuture future = dispatcher .queue (request );
44
+ future .onSuccess (
45
+ response -> {
46
+ if (isSuccessfulResponse (response )) {
47
+ try {
48
+ List <T > resultList = parseResponseFromMap (key , response .body ());
49
+ asyncResponse .setResult (resultList );
50
+ } catch (Exception e ) {
51
+ asyncResponse .setException (e );
52
+ }
53
+ } else {
54
+ asyncResponse .setException (errorResponseException (response ));
55
+ }
56
+ });
57
+ future .onError (asyncResponse ::setException );
58
+ return asyncResponse ;
59
+ }
60
+
61
+ private <T > List <T > parseResponseFromList (Class <T > elementType , String response )
37
62
throws JsonProcessingException {
38
63
return OBJECT_MAPPER .readValue (
39
64
response ,
40
65
OBJECT_MAPPER .getTypeFactory ().constructCollectionType (List .class , elementType ));
41
66
}
42
67
68
+ private <T > List <T > parseResponseFromMap (String key , String response )
69
+ throws JsonProcessingException {
70
+ Map <String , List <T >> res =
71
+ OBJECT_MAPPER .readValue (
72
+ response ,
73
+ OBJECT_MAPPER
74
+ .getTypeFactory ()
75
+ .constructMapType (Map .class , String .class , List .class ));
76
+ return res .get (key );
77
+ }
78
+
43
79
public <T > AsyncResponse <T > callAndParse (Class <T > clazz , DiscordRequest request ) {
44
80
AsyncResponse <T > asyncResponse = new AsyncResponse <>();
45
81
DiscordResponseFuture future = dispatcher .queue (request );
@@ -50,20 +86,24 @@ public <T> AsyncResponse<T> callAndParse(Class<T> clazz, DiscordRequest request)
50
86
51
87
private <T > void success (
52
88
Class <T > type , DiscordResponse response , AsyncResponse <T > asyncResponse ) {
53
- if (response . status () >= 200 && response . status () < 300 ) {
89
+ if (isSuccessfulResponse ( response ) ) {
54
90
try {
55
91
T result = OBJECT_MAPPER .readValue (response .body (), type );
56
92
asyncResponse .setResult (result );
57
93
} catch (JsonProcessingException e ) {
58
94
asyncResponse .setException (e );
59
95
}
60
96
} else {
61
- asyncResponse .setException (
62
- new Exception (
63
- "Received HTTP status code "
64
- + response .status ()
65
- + " "
66
- + response .body ()));
97
+ asyncResponse .setException (errorResponseException (response ));
67
98
}
68
99
}
100
+
101
+ private boolean isSuccessfulResponse (DiscordResponse response ) {
102
+ return response .status () >= 200 && response .status () < 300 ;
103
+ }
104
+
105
+ private Throwable errorResponseException (DiscordResponse response ) {
106
+ return new Exception (
107
+ "Received HTTP status code " + response .status () + " " + response .body ());
108
+ }
69
109
}
0 commit comments