// Path: erp-library/src/main/java/com.jukusoft/erp/lib/message/StatusCode.java
// public enum StatusCode {
// 
//     NOT_FOUND(404),
// 
//     OK(200),
// 
//     BAD_REQUEST(400),
// 
//     WRONG_SESSION(400),
// 
//     FORBIDDEN(403),
// 
//     WRONG_PERMISSIONS(403),
// 
//     INTERNAL_SERVER_ERROR(500),
// 
//     SERVICE_UNAVAILABLE(503),
// 
//     UNKNOWN(500);
// 
//     private final int value;
// 
//     private StatusCode(int value) {
//         this.value = value;
//     }
// 
//     public int getValue () {
//         return this.value;
//     }
// 
//     public static StatusCode getByString (String str) {
//         switch (str.trim().toUpperCase()) {
//             case "NOT_FOUND":
//                 return NOT_FOUND;
// 
//             case "OK":
// 
//                 return OK;
// 
//             case "BAD_REQUEST":
// 
//                 return BAD_REQUEST;
// 
//             case "FORBIDDEN":
// 
//                 return FORBIDDEN;
// 
//             case "WRONG_PERMISSIONS":
// 
//                 return WRONG_PERMISSIONS;
// 
//             case "SERVICE_UNAVAILABLE":
// 
//                 return SERVICE_UNAVAILABLE;
// 
//             default:
// 
//                 return UNKNOWN;
//         }
//     }
// 
// }


import com.jukusoft.erp.lib.message.StatusCode;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.eventbus.MessageCodec;
import io.vertx.core.json.JsonObject;

        //encode json object to string
        String jsonToStr = json.toString();

        // Length of JSON: is NOT characters count
        int length = jsonToStr.getBytes().length;

        // Write data into given buffer
        buffer.appendInt(length);
        buffer.appendString(jsonToStr);
    }

    @Override
    public ApiResponse decodeFromWire(int position, Buffer buffer) {
        // My custom message starting from this *position* of buffer
        int _pos = position;

        // Length of JSON
        int length = buffer.getInt(_pos);

        // Get JSON string by it`s length
        // Jump 4 because getInt() == 4 bytes
        String jsonStr = buffer.getString(_pos+=4, _pos+=length);
        JsonObject json = new JsonObject(jsonStr);

        ApiResponse res = new ApiResponse(json.getLong("cluster-message-id"), json.getString("external-id"), json.getString("session-id"), json.getString("event"));

        res.eventName = json.getString("event");
        res.data = json.getJsonObject("data");
        res.ackID = json.getString("ackID");
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/message/StatusCode.java
// public enum StatusCode {
// 
//     NOT_FOUND(404),
// 
//     OK(200),
// 
//     BAD_REQUEST(400),
// 
//     WRONG_SESSION(400),
// 
//     FORBIDDEN(403),
// 
//     WRONG_PERMISSIONS(403),
// 
//     INTERNAL_SERVER_ERROR(500),
// 
//     SERVICE_UNAVAILABLE(503),
// 
//     UNKNOWN(500);
// 
//     private final int value;
// 
//     private StatusCode(int value) {
//         this.value = value;
//     }
// 
//     public int getValue () {
//         return this.value;
//     }
// 
//     public static StatusCode getByString (String str) {
//         switch (str.trim().toUpperCase()) {
//             case "NOT_FOUND":
//                 return NOT_FOUND;
// 
//             case "OK":
// 
//                 return OK;
// 
//             case "BAD_REQUEST":
// 
//                 return BAD_REQUEST;
// 
//             case "FORBIDDEN":
// 
//                 return FORBIDDEN;
// 
//             case "WRONG_PERMISSIONS":
// 
//                 return WRONG_PERMISSIONS;
// 
//             case "SERVICE_UNAVAILABLE":
// 
//                 return SERVICE_UNAVAILABLE;
// 
//             default:
// 
//                 return UNKNOWN;
//         }
//     }
// 
// }


// Path: erp-library/src/main/java/com.jukusoft/erp/lib/message/response/ApiResponseCodec.java
import com.jukusoft.erp.lib.message.StatusCode;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.eventbus.MessageCodec;
import io.vertx.core.json.JsonObject;


        //encode json object to string
        String jsonToStr = json.toString();

        // Length of JSON: is NOT characters count
        int length = jsonToStr.getBytes().length;

        // Write data into given buffer
        buffer.appendInt(length);
        buffer.appendString(jsonToStr);
    }

    @Override
    public ApiResponse decodeFromWire(int position, Buffer buffer) {
        // My custom message starting from this *position* of buffer
        int _pos = position;

        // Length of JSON
        int length = buffer.getInt(_pos);

        // Get JSON string by it`s length
        // Jump 4 because getInt() == 4 bytes
        String jsonStr = buffer.getString(_pos+=4, _pos+=length);
        JsonObject json = new JsonObject(jsonStr);

        ApiResponse res = new ApiResponse(json.getLong("cluster-message-id"), json.getString("external-id"), json.getString("session-id"), json.getString("event"));

        res.eventName = json.getString("event");
        res.data = json.getJsonObject("data");
        res.ackID = json.getString("ackID");
        res.statusCode = StatusCode.getByString(json.getString("statusCode"));