Add FfiResultVoid type

This commit is contained in:
Steve Myers 2021-07-03 19:24:29 -07:00
parent d00cc73261
commit 8443265142
6 changed files with 43 additions and 48 deletions

View File

@ -30,27 +30,22 @@ interface LibJna : Library {
// typedef struct { // typedef struct {
// //
// int32_t ok;
//
// char * err; // char * err;
// //
//} FfiResult_int32_t; //} FfiResultVoid_t;
open class FfiResult_int32_t : Structure() { open class FfiResultVoid_t : Structure() {
class ByValue : FfiResult_int32_t(), Structure.ByValue class ByValue : FfiResultVoid_t(), Structure.ByValue
class ByReference : FfiResult_int32_t(), Structure.ByReference class ByReference : FfiResultVoid_t(), Structure.ByReference
@JvmField
var ok: Int = 0
@JvmField @JvmField
var err: String = "" var err: String = ""
override fun getFieldOrder() = listOf("ok", "err") override fun getFieldOrder() = listOf("err")
} }
// void free_int_result ( // void free_void_result (
// FfiResult_int32_t int_result); // FfiResultVoid_t void_result);
fun free_int_result(void_result: FfiResult_int32_t.ByValue) fun free_void_result(void_result: FfiResultVoid_t.ByValue)
// void free_string ( // void free_string (
// char * string); // char * string);
@ -241,9 +236,9 @@ interface LibJna : Library {
// FfiResult_Vec_LocalUtxo_t unspent_result); // FfiResult_Vec_LocalUtxo_t unspent_result);
fun free_unspent_result(unspent_result: FfiResultVec_LocalUtxo_t.ByValue) fun free_unspent_result(unspent_result: FfiResultVec_LocalUtxo_t.ByValue)
// FfiResult_int32_t sync_wallet ( // FfiResultVoid_t sync_wallet (
// OpaqueWallet_t const * opaque_wallet); // OpaqueWallet_t const * opaque_wallet);
fun sync_wallet(opaque_wallet: OpaqueWallet_t): FfiResult_int32_t.ByValue fun sync_wallet(opaque_wallet: OpaqueWallet_t): FfiResultVoid_t.ByValue
// FfiResult_char_ptr_t new_address ( // FfiResult_char_ptr_t new_address (
// OpaqueWallet_t const * opaque_wallet); // OpaqueWallet_t const * opaque_wallet);

View File

@ -7,14 +7,14 @@ import org.bitcoindevkit.bdk.LibJna
import org.slf4j.Logger import org.slf4j.Logger
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
class VoidResult constructor(private val ffiResultInt32T: LibJna.FfiResult_int32_t.ByValue) : class VoidResult constructor(private val ffiResultVoidT: LibJna.FfiResultVoid_t.ByValue) :
LibBase() { LibBase() {
private val log: Logger = LoggerFactory.getLogger(VoidResult::class.java) private val log: Logger = LoggerFactory.getLogger(VoidResult::class.java)
fun value(): Unit { fun value(): Unit {
val err = ffiResultInt32T.err val err = ffiResultVoidT.err
//val ok = ffiResultInt32T.ok
when { when {
err.isNotEmpty() -> { err.isNotEmpty() -> {
log.error("JnaError: $err") log.error("JnaError: $err")
@ -27,7 +27,7 @@ class VoidResult constructor(private val ffiResultInt32T: LibJna.FfiResult_int32
} }
protected fun finalize() { protected fun finalize() {
libJna.free_int_result(ffiResultInt32T) libJna.free_void_result(ffiResultVoidT)
log.debug("$ffiResultInt32T freed") log.debug("$ffiResultVoidT freed")
} }
} }

View File

@ -37,19 +37,13 @@ FfiResult_OpaqueWallet_ptr_t new_wallet_result (
void free_wallet_result ( void free_wallet_result (
FfiResult_OpaqueWallet_ptr_t wallet_result); FfiResult_OpaqueWallet_ptr_t wallet_result);
#include <stddef.h>
#include <stdint.h>
typedef struct { typedef struct {
int32_t ok;
char * err; char * err;
} FfiResult_int32_t; } FfiResultVoid_t;
FfiResult_int32_t sync_wallet ( FfiResultVoid_t sync_wallet (
OpaqueWallet_t const * opaque_wallet); OpaqueWallet_t const * opaque_wallet);
typedef struct { typedef struct {
@ -63,6 +57,10 @@ typedef struct {
FfiResult_char_ptr_t new_address ( FfiResult_char_ptr_t new_address (
OpaqueWallet_t const * opaque_wallet); OpaqueWallet_t const * opaque_wallet);
#include <stddef.h>
#include <stdint.h>
typedef struct { typedef struct {
char * txid; char * txid;
@ -137,8 +135,8 @@ void free_database_config (
void free_string_result ( void free_string_result (
FfiResult_char_ptr_t string_result); FfiResult_char_ptr_t string_result);
void free_int_result ( void free_void_result (
FfiResult_int32_t int_result); FfiResultVoid_t void_result);
/** \brief /** \brief
* Free a Rust-allocated string * Free a Rust-allocated string

View File

@ -48,10 +48,9 @@ int main (int argc, char const * const argv[])
OpaqueWallet_t *wallet = wallet_result.ok; OpaqueWallet_t *wallet = wallet_result.ok;
// sync wallet // sync wallet
FfiResult_int32_t sync_result = sync_wallet(wallet); FfiResultVoid_t sync_result = sync_wallet(wallet);
assert(sync_result.ok == 0);
assert(strlen(sync_result.err) == 0); assert(strlen(sync_result.err) == 0);
free_int_result(sync_result); free_void_result(sync_result);
// new address // new address
FfiResult_char_ptr_t address1_result = new_address(wallet); FfiResult_char_ptr_t address1_result = new_address(wallet);
@ -75,7 +74,7 @@ int main (int argc, char const * const argv[])
//// free_wallet_result(wallet_result); //// free_wallet_result(wallet_result);
// verify sync_wallet after free_wallet fails (core dumped) // verify sync_wallet after free_wallet fails (core dumped)
//// FfiResult_int32_t sync_result2 = sync_wallet(wallet); //// FfiResultVoid_t sync_result2 = sync_wallet(wallet);
} }
// test get unspent utxos // test get unspent utxos
@ -97,10 +96,9 @@ int main (int argc, char const * const argv[])
OpaqueWallet_t *wallet = wallet_result.ok; OpaqueWallet_t *wallet = wallet_result.ok;
// sync wallet // sync wallet
FfiResult_int32_t sync_result = sync_wallet(wallet); FfiResultVoid_t sync_result = sync_wallet(wallet);
assert(sync_result.ok == 0);
assert(strlen(sync_result.err) == 0); assert(strlen(sync_result.err) == 0);
free_int_result(sync_result); free_void_result(sync_result);
// list unspent // list unspent
FfiResult_Vec_LocalUtxo_t unspent_result = list_unspent(wallet); FfiResult_Vec_LocalUtxo_t unspent_result = list_unspent(wallet);
@ -144,10 +142,9 @@ int main (int argc, char const * const argv[])
OpaqueWallet_t *wallet = wallet_result.ok; OpaqueWallet_t *wallet = wallet_result.ok;
// sync wallet // sync wallet
FfiResult_int32_t sync_result = sync_wallet(wallet); FfiResultVoid_t sync_result = sync_wallet(wallet);
assert(sync_result.ok == 0);
assert(sync_result.err == NULL); assert(sync_result.err == NULL);
free_int_result(sync_result); free_void_result(sync_result);
// get balance // get balance
FfiResultT_uint64_t balance_result = balance(wallet); FfiResultT_uint64_t balance_result = balance(wallet);

View File

@ -9,14 +9,21 @@ pub struct FfiResult<T> {
pub err: char_p_boxed, pub err: char_p_boxed,
} }
#[derive_ReprC]
#[repr(C)]
#[derive(Debug)]
pub struct FfiResultVoid {
pub err: char_p_boxed,
}
#[ffi_export] #[ffi_export]
fn free_string_result(string_result: FfiResult<char_p_boxed>) { fn free_string_result(string_result: FfiResult<char_p_boxed>) {
drop(string_result) drop(string_result)
} }
#[ffi_export] #[ffi_export]
fn free_int_result(int_result: FfiResult<i32>) { fn free_void_result(void_result: FfiResultVoid) {
drop(int_result) drop(void_result)
} }
// TODO do we need this? remove? // TODO do we need this? remove?

View File

@ -13,7 +13,7 @@ use blockchain::BlockchainConfig;
use database::DatabaseConfig; use database::DatabaseConfig;
use crate::error::get_name; use crate::error::get_name;
use crate::types::FfiResult; use crate::types::{FfiResult, FfiResultVoid};
use std::ffi::CString; use std::ffi::CString;
mod blockchain; mod blockchain;
@ -77,15 +77,13 @@ fn free_wallet_result(wallet_result: FfiResult<Option<Box<OpaqueWallet>>>) {
// wallet operations // wallet operations
#[ffi_export] #[ffi_export]
fn sync_wallet(opaque_wallet: &OpaqueWallet) -> FfiResult<i32> { fn sync_wallet(opaque_wallet: &OpaqueWallet) -> FfiResultVoid {
let int_result = opaque_wallet.raw.sync(log_progress(), Some(100)); let int_result = opaque_wallet.raw.sync(log_progress(), Some(100));
match int_result { match int_result {
Ok(_v) => FfiResult { Ok(_v) => FfiResultVoid {
ok: 0,
err: char_p_boxed::from(CString::default()), err: char_p_boxed::from(CString::default()),
}, },
Err(e) => FfiResult { Err(e) => FfiResultVoid {
ok: -1,
err: char_p_boxed::try_from(get_name(&e)).unwrap(), err: char_p_boxed::try_from(get_name(&e)).unwrap(),
}, },
} }