// Path: src/main/java/com/github/sbouclier/result/Result.java
// public class Result<T> {
// 
//     private ArrayList<String> error = new ArrayList<>();
//     private T result;
// 
//     /**
//      * Get errors
//      *
//      * @return errors
//      */
//     public ArrayList<String> getError() {
//         return error;
//     }
// 
//     /**
//      * Get result
//      *
//      * @return result
//      */
//     public T getResult() {
//         return result;
//     }
// 
//     /**
//      * Set result
//      *
//      * @param result
//      */
//     public void setResult(T result) {
//         this.result = result;
//     }
// 
//     @Override
//     public String toString() {
//         return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
//                 .append("error", error)
//                 .append("result", result)
//                 .toString();
//     }
// }
// 
// Path: src/main/java/com/github/sbouclier/result/ResultWithLastId.java
// public class ResultWithLastId<T> extends Result<T> {
//     private Long lastId = 0L;
// 
//     public Long getLastId() {
//         return lastId;
//     }
// 
//     public void setLastId(Long lastId) {
//         this.lastId = lastId;
//     }
// }


import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.sbouclier.result.Result;
import com.github.sbouclier.result.ResultWithLastId;
import java.io.IOException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
            final String responseString = this.client.executePublicQuery(baseUrl, method.getUrl(apiVersion), params);
            T res = new ObjectMapper().readValue(responseString, result);

            if (!res.getError().isEmpty()) {
                throw new KrakenApiException(res.getError());
            }

            return res;
        } catch (IOException ex) {
            throw new KrakenApiException("unable to query Kraken API", ex);
        }
    }

    /**
     * Call public kraken method and extract last id
     *
     * @param baseUrl kraken base url
     * @param method  kraken method
     * @param result  result class
     * @param params  method parameters
     * @return result
     * @throws KrakenApiException
     */
    public T callPublicWithLastId(String baseUrl, KrakenApiMethod method, Class<T> result, Map<String, String> params) throws KrakenApiException {
        try {
            final String responseString = this.client.executePublicQuery(baseUrl, method.getUrl(apiVersion), params);

            LastIdExtractedResult extractedResult = extractLastId(responseString);

            T res = new ObjectMapper().readValue(extractedResult.responseWithoutLastId, result);
// Path: src/main/java/com/github/sbouclier/result/Result.java
// public class Result<T> {
// 
//     private ArrayList<String> error = new ArrayList<>();
//     private T result;
// 
//     /**
//      * Get errors
//      *
//      * @return errors
//      */
//     public ArrayList<String> getError() {
//         return error;
//     }
// 
//     /**
//      * Get result
//      *
//      * @return result
//      */
//     public T getResult() {
//         return result;
//     }
// 
//     /**
//      * Set result
//      *
//      * @param result
//      */
//     public void setResult(T result) {
//         this.result = result;
//     }
// 
//     @Override
//     public String toString() {
//         return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
//                 .append("error", error)
//                 .append("result", result)
//                 .toString();
//     }
// }
// 
// Path: src/main/java/com/github/sbouclier/result/ResultWithLastId.java
// public class ResultWithLastId<T> extends Result<T> {
//     private Long lastId = 0L;
// 
//     public Long getLastId() {
//         return lastId;
//     }
// 
//     public void setLastId(Long lastId) {
//         this.lastId = lastId;
//     }
// }


// Path: src/main/java/com/github/sbouclier/HttpApiClient.java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.sbouclier.result.Result;
import com.github.sbouclier.result.ResultWithLastId;
import java.io.IOException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

            final String responseString = this.client.executePublicQuery(baseUrl, method.getUrl(apiVersion), params);
            T res = new ObjectMapper().readValue(responseString, result);

            if (!res.getError().isEmpty()) {
                throw new KrakenApiException(res.getError());
            }

            return res;
        } catch (IOException ex) {
            throw new KrakenApiException("unable to query Kraken API", ex);
        }
    }

    /**
     * Call public kraken method and extract last id
     *
     * @param baseUrl kraken base url
     * @param method  kraken method
     * @param result  result class
     * @param params  method parameters
     * @return result
     * @throws KrakenApiException
     */
    public T callPublicWithLastId(String baseUrl, KrakenApiMethod method, Class<T> result, Map<String, String> params) throws KrakenApiException {
        try {
            final String responseString = this.client.executePublicQuery(baseUrl, method.getUrl(apiVersion), params);

            LastIdExtractedResult extractedResult = extractLastId(responseString);

            T res = new ObjectMapper().readValue(extractedResult.responseWithoutLastId, result);
            ((ResultWithLastId) res).setLastId(extractedResult.lastId);