|
1 | 1 | package io.avaje.http.client;
|
2 | 2 |
|
3 | 3 | import java.io.InputStream;
|
| 4 | +import java.lang.reflect.ParameterizedType; |
4 | 5 | import java.net.http.HttpResponse;
|
5 | 6 | import java.util.List;
|
6 | 7 | import java.util.concurrent.CompletableFuture;
|
@@ -64,6 +65,21 @@ public <E> HttpCall<Stream<E>> stream(Class<E> type) {
|
64 | 65 | return new CallStream<>(type);
|
65 | 66 | }
|
66 | 67 |
|
| 68 | + @Override |
| 69 | + public <E> HttpCall<E> bean(ParameterizedType type) { |
| 70 | + return new CallBean<>(type); |
| 71 | + } |
| 72 | + |
| 73 | + @Override |
| 74 | + public <E> HttpCall<List<E>> list(ParameterizedType type) { |
| 75 | + return new CallList<>(type); |
| 76 | + } |
| 77 | + |
| 78 | + @Override |
| 79 | + public <E> HttpCall<Stream<E>> stream(ParameterizedType type) { |
| 80 | + return new CallStream<>(type); |
| 81 | + } |
| 82 | + |
67 | 83 | private class CallVoid implements HttpCall<HttpResponse<Void>> {
|
68 | 84 | @Override
|
69 | 85 | public HttpResponse<Void> execute() {
|
@@ -132,46 +148,85 @@ public CompletableFuture<HttpResponse<InputStream>> async() {
|
132 | 148 |
|
133 | 149 | private class CallBean<E> implements HttpCall<E> {
|
134 | 150 | private final Class<E> type;
|
| 151 | + private final ParameterizedType genericType; |
| 152 | + private final boolean isGeneric; |
| 153 | + |
135 | 154 | CallBean(Class<E> type) {
|
| 155 | + this.isGeneric = false; |
136 | 156 | this.type = type;
|
| 157 | + this.genericType = null; |
137 | 158 | }
|
| 159 | + |
| 160 | + CallBean(ParameterizedType type) { |
| 161 | + this.isGeneric = true; |
| 162 | + this.type = null; |
| 163 | + this.genericType = type; |
| 164 | + } |
| 165 | + |
138 | 166 | @Override
|
139 | 167 | public E execute() {
|
140 |
| - return request.bean(type); |
| 168 | + return isGeneric ? request.bean(genericType) : request.bean(type); |
141 | 169 | }
|
| 170 | + |
142 | 171 | @Override
|
143 | 172 | public CompletableFuture<E> async() {
|
144 |
| - return request.async().bean(type); |
| 173 | + return isGeneric ? request.async().bean(genericType) : request.async().bean(type); |
145 | 174 | }
|
146 | 175 | }
|
147 | 176 |
|
148 | 177 | private class CallList<E> implements HttpCall<List<E>> {
|
149 | 178 | private final Class<E> type;
|
| 179 | + private final ParameterizedType genericType; |
| 180 | + private final boolean isGeneric; |
| 181 | + |
150 | 182 | CallList(Class<E> type) {
|
| 183 | + this.isGeneric = false; |
151 | 184 | this.type = type;
|
| 185 | + this.genericType = null; |
152 | 186 | }
|
| 187 | + |
| 188 | + CallList(ParameterizedType type) { |
| 189 | + this.isGeneric = true; |
| 190 | + this.type = null; |
| 191 | + this.genericType = type; |
| 192 | + } |
| 193 | + |
153 | 194 | @Override
|
154 | 195 | public List<E> execute() {
|
155 |
| - return request.list(type); |
| 196 | + return isGeneric ? request.list(genericType) : request.list(type); |
156 | 197 | }
|
| 198 | + |
157 | 199 | @Override
|
158 | 200 | public CompletableFuture<List<E>> async() {
|
159 |
| - return request.async().list(type); |
| 201 | + return isGeneric ? request.async().list(genericType) : request.async().list(type); |
160 | 202 | }
|
161 | 203 | }
|
162 | 204 |
|
163 | 205 | private class CallStream<E> implements HttpCall<Stream<E>> {
|
164 | 206 | private final Class<E> type;
|
| 207 | + private final ParameterizedType genericType; |
| 208 | + private final boolean isGeneric; |
| 209 | + |
165 | 210 | CallStream(Class<E> type) {
|
| 211 | + this.isGeneric = false; |
166 | 212 | this.type = type;
|
| 213 | + this.genericType = null; |
| 214 | + } |
| 215 | + |
| 216 | + CallStream(ParameterizedType type) { |
| 217 | + this.isGeneric = true; |
| 218 | + this.type = null; |
| 219 | + this.genericType = type; |
167 | 220 | }
|
| 221 | + |
168 | 222 | @Override
|
169 | 223 | public Stream<E> execute() {
|
170 |
| - return request.stream(type); |
| 224 | + return isGeneric ? request.stream(genericType) : request.stream(type); |
171 | 225 | }
|
| 226 | + |
172 | 227 | @Override
|
173 | 228 | public CompletableFuture<Stream<E>> async() {
|
174 |
| - return request.async().stream(type); |
| 229 | + return isGeneric ? request.async().stream(genericType) : request.async().stream(type); |
175 | 230 | }
|
176 | 231 | }
|
177 | 232 |
|
|
0 commit comments