Remove unneeded pointers from FfiResult types

This commit is contained in:
Steve Myers
2021-07-03 19:07:49 -07:00
parent 62f18bdc2c
commit d00cc73261
12 changed files with 264 additions and 241 deletions

View File

@@ -14,21 +14,8 @@
extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
typedef struct BlockchainConfig BlockchainConfig_t;
BlockchainConfig_t * new_electrum_config (
char const * url,
char const * socks5,
int16_t retry,
int16_t timeout);
void free_blockchain_config (
BlockchainConfig_t * blockchain_config);
typedef struct DatabaseConfig DatabaseConfig_t;
typedef struct OpaqueWallet OpaqueWallet_t;
@@ -37,35 +24,39 @@ typedef struct {
OpaqueWallet_t * ok;
char * * err;
char * err;
} FfiResult_OpaqueWallet_t;
} FfiResult_OpaqueWallet_ptr_t;
FfiResult_OpaqueWallet_t new_wallet_result (
FfiResult_OpaqueWallet_ptr_t new_wallet_result (
char const * descriptor,
char const * change_descriptor,
BlockchainConfig_t const * blockchain_config,
DatabaseConfig_t const * database_config);
void free_wallet_result (
FfiResult_OpaqueWallet_t wallet_result);
FfiResult_OpaqueWallet_ptr_t wallet_result);
#include <stddef.h>
#include <stdint.h>
typedef struct {
void * ok;
int32_t ok;
char * * err;
char * err;
} FfiResult_void_t;
} FfiResult_int32_t;
FfiResult_void_t sync_wallet (
FfiResult_int32_t sync_wallet (
OpaqueWallet_t const * opaque_wallet);
typedef struct {
char * * ok;
char * ok;
char * * err;
char * err;
} FfiResult_char_ptr_t;
@@ -115,15 +106,24 @@ typedef struct {
Vec_LocalUtxo_t ok;
char * * err;
char * err;
} FfiResultVec_LocalUtxo_t;
} FfiResult_Vec_LocalUtxo_t;
FfiResultVec_LocalUtxo_t list_unspent (
FfiResult_Vec_LocalUtxo_t list_unspent (
OpaqueWallet_t const * opaque_wallet);
void free_unspent_result (
FfiResultVec_LocalUtxo_t unspent_result);
FfiResult_Vec_LocalUtxo_t unspent_result);
BlockchainConfig_t * new_electrum_config (
char const * url,
char const * socks5,
int16_t retry,
int16_t timeout);
void free_blockchain_config (
BlockchainConfig_t * blockchain_config);
DatabaseConfig_t * new_memory_config (void);
@@ -137,8 +137,8 @@ void free_database_config (
void free_string_result (
FfiResult_char_ptr_t string_result);
void free_void_result (
FfiResult_void_t void_result);
void free_int_result (
FfiResult_int32_t int_result);
/** \brief
* Free a Rust-allocated string

View File

@@ -13,14 +13,14 @@ int main (int argc, char const * const argv[])
DatabaseConfig_t *db_config = new_memory_config();
// new wallet with bad descriptor
FfiResult_OpaqueWallet_t wallet_result = new_wallet_result("bad","bad",bc_config,db_config);
assert(wallet_result.err != NULL);
FfiResult_OpaqueWallet_ptr_t wallet_result = new_wallet_result("bad","bad",bc_config,db_config);
assert(strlen(wallet_result.err) > 0);
assert(wallet_result.ok == NULL);
free_blockchain_config(bc_config);
free_database_config(db_config);
char *wallet_err = *wallet_result.err;
char *wallet_err = wallet_result.err;
assert(wallet_err != NULL);
assert( 0 == strcmp(wallet_err,"Descriptor") );
// printf("wallet err: %s\n", wallet_err);
@@ -37,8 +37,9 @@ int main (int argc, char const * const argv[])
DatabaseConfig_t *db_config = new_memory_config();
// new wallet
FfiResult_OpaqueWallet_t wallet_result = new_wallet_result(desc,change,bc_config,db_config);
assert(wallet_result.err == NULL);
FfiResult_OpaqueWallet_ptr_t wallet_result = new_wallet_result(desc,change,bc_config,db_config);
// printf("wallet_result.err = %ld\n", strlen(wallet_result.err));
assert(strlen(wallet_result.err) == 0);
assert(wallet_result.ok != NULL);
free_blockchain_config(bc_config);
@@ -46,35 +47,35 @@ int main (int argc, char const * const argv[])
OpaqueWallet_t *wallet = wallet_result.ok;
// test sync wallet
FfiResult_void_t sync_result = sync_wallet(wallet);
assert(sync_result.ok != NULL);
assert(sync_result.err == NULL);
free_void_result(sync_result);
// sync wallet
FfiResult_int32_t sync_result = sync_wallet(wallet);
assert(sync_result.ok == 0);
assert(strlen(sync_result.err) == 0);
free_int_result(sync_result);
// test new address
FfiResult_char_ptr_t address_result1 = new_address(wallet);
assert(address_result1.ok != NULL);
assert(address_result1.err == NULL);
// printf("address1 = %s\n", *address_result1.ok);
assert( 0 == strcmp(*address_result1.ok,"tb1qgkhp034fyxeta00h0nne9tzfm0vsxq4prduzxp"));
free_string_result(address_result1);
// new address
FfiResult_char_ptr_t address1_result = new_address(wallet);
assert(address1_result.ok != NULL);
assert(strlen(address1_result.err) == 0);
// printf("address1 = %s\n", *address1_result.ok);
assert( 0 == strcmp(address1_result.ok,"tb1qgkhp034fyxeta00h0nne9tzfm0vsxq4prduzxp"));
free_string_result(address1_result);
FfiResult_char_ptr_t address_result2 = new_address(wallet);
assert(address_result2.ok != NULL);
assert(address_result2.err == NULL);
// printf("address2 = %s\n", *address_result2.ok);
assert( 0 == strcmp(*address_result2.ok,"tb1qd6u9q327sru2ljvwzdtfrdg36sapax7udz97wf"));
free_string_result(address_result2);
FfiResult_char_ptr_t address2_result = new_address(wallet);
assert(address2_result.ok != NULL);
assert(strlen(address2_result.err) == 0);
// printf("address2 = %s\n", *address2_result.ok);
assert( 0 == strcmp(address2_result.ok,"tb1qd6u9q327sru2ljvwzdtfrdg36sapax7udz97wf"));
free_string_result(address2_result);
// test free_wallet
// free_wallet
free_wallet_result(wallet_result);
// verify free_wallet after free_wallet fails (core dumped)
//// free_wallet_result(wallet_result);
// verify sync_wallet after free_wallet fails (core dumped)
//// FfiResult_void_t sync_result2 = sync_wallet(wallet);
//// FfiResult_int32_t sync_result2 = sync_wallet(wallet);
}
// test get unspent utxos
@@ -86,8 +87,8 @@ int main (int argc, char const * const argv[])
DatabaseConfig_t *db_config = new_memory_config();
// new wallet
FfiResult_OpaqueWallet_t wallet_result = new_wallet_result(desc,change,bc_config,db_config);
assert(wallet_result.err == NULL);
FfiResult_OpaqueWallet_ptr_t wallet_result = new_wallet_result(desc,change,bc_config,db_config);
assert(strlen(wallet_result.err) == 0);
assert(wallet_result.ok != NULL);
free_blockchain_config(bc_config);
@@ -95,16 +96,16 @@ int main (int argc, char const * const argv[])
OpaqueWallet_t *wallet = wallet_result.ok;
// test sync wallet
FfiResult_void_t sync_result = sync_wallet(wallet);
assert(sync_result.ok != NULL);
assert(sync_result.err == NULL);
free_void_result(sync_result);
// sync wallet
FfiResult_int32_t sync_result = sync_wallet(wallet);
assert(sync_result.ok == 0);
assert(strlen(sync_result.err) == 0);
free_int_result(sync_result);
// list unspent
FfiResultVec_LocalUtxo_t unspent_result = list_unspent(wallet);
FfiResult_Vec_LocalUtxo_t unspent_result = list_unspent(wallet);
assert(unspent_result.ok.len == 7);
assert(unspent_result.err == NULL);
assert(strlen(unspent_result.err) == 0);
LocalUtxo_t * unspent_ptr = unspent_result.ok.ptr;
for (int i = 0; i < unspent_result.ok.len; i++) {
@@ -123,6 +124,41 @@ int main (int argc, char const * const argv[])
free_unspent_result(unspent_result);
free_wallet_result(wallet_result);
}
// test balance
/*{
char const *desc = "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)";
char const *change = "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)";
BlockchainConfig_t *bc_config = new_electrum_config("ssl://electrum.blockstream.info:60002", NULL, 5, 30);
DatabaseConfig_t *db_config = new_memory_config();
// new wallet
FfiResult_OpaqueWallet_ptr_t wallet_result = new_wallet_result(desc,change,bc_config,db_config);
assert(wallet_result.err == NULL);
assert(wallet_result.ok != NULL);
free_blockchain_config(bc_config);
free_database_config(db_config);
OpaqueWallet_t *wallet = wallet_result.ok;
// sync wallet
FfiResult_int32_t sync_result = sync_wallet(wallet);
assert(sync_result.ok == 0);
assert(sync_result.err == NULL);
free_int_result(sync_result);
// get balance
FfiResultT_uint64_t balance_result = balance(wallet);
assert(balance_result.err == NULL);
printf("balance = %lu\n", balance_result.ok);
assert(balance_result.ok > 0);
// free balance and wallet results
free_u64_result(balance_result);
free_wallet_result(wallet_result);
}*/
return EXIT_SUCCESS;
}