private <T extends SlackResponse> CompletableFuture<Result<T, SlackError>> executeLoggedAs( SlackMethod method, HttpRequest request, Class<T> responseType ) { long requestId = REQUEST_COUNTER.getAndIncrement(); return executeLogged(requestId, method, request) .thenApply(response -> { try { JsonNode responseJson = response.getAsJsonNode(); boolean isOk = responseJson.get("ok").asBoolean(); if (isOk) { return Result.ok(ObjectMapperUtils.mapper().treeToValue(responseJson, responseType)); } SlackError error = ObjectMapperUtils.mapper().treeToValue(response.getAsJsonNode(), SlackError.class); responseDebugger.debugSlackApiError(requestId, method, request, response); return Result.err(error); } catch (JsonProcessingException e) { responseDebugger.debugProcessingFailure(requestId, method, request, response, e); return Result.err(SlackError.builder() .setError(SlackErrorType.JSON_PARSING_FAILED.getCode()) .setType(SlackErrorType.JSON_PARSING_FAILED) .build() ); } catch (RuntimeException ex) { responseDebugger.debugProcessingFailure(requestId, method, request, response, ex); throw ex; } }); }