extern "C" {
#include "dittoffi.h"
}
#include "retainable.h"

#ifdef SWIG
%feature("director", assumeoverride=1) RetainableContinuation;
#endif

/** \brief
 *  Context object for Kotlin DittoLogger.InternalLogExportContinuation which handles wiring up the
 *  callback from Rust across the FFI boundary.
 */
class RetainableContinuation : public Retainable {
public:
    virtual ~RetainableContinuation() {}

    // To be overridden by kotlin/java
    virtual void invoke(dittoffi_result_uint64_t result) = 0;

    static void invokeContinuation(void *const context,
                                   dittoffi_result_uint64_t result) {
        auto instance = static_cast<RetainableContinuation *>(context);
        instance->invoke(result);
    }

    // Kotlin calls into for help with struct construction.
    BoxDynFnMut1_void_dittoffi_result_uint64_t intoFfi() {
        this->java_retain();
        BoxDynFnMut1_void_dittoffi_result_uint64_t ffiCompletion = {};
        ffiCompletion.env_ptr = this;
        ffiCompletion.call = RetainableContinuation::invokeContinuation;
        ffiCompletion.free = RetainableContinuation::invokeRelease;
        return ffiCompletion;
    }
};

