Add FfiResultVoid type
This commit is contained in:
parent
d00cc73261
commit
8443265142
@ -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);
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
18
cc/bdk_ffi.h
18
cc/bdk_ffi.h
@ -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
|
||||||
|
@ -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);
|
||||||
|
11
src/types.rs
11
src/types.rs
@ -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?
|
||||||
|
@ -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(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user