Return FfiResult errors as FfiError enum short values

This commit is contained in:
Steve Myers
2021-07-03 20:40:08 -07:00
parent 8443265142
commit adadcbc982
14 changed files with 281 additions and 144 deletions

View File

@@ -14,8 +14,136 @@
extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
/** \remark Has the same ABI as `uint16_t` **/
#ifdef DOXYGEN
typedef enum FfiError
#else
typedef uint16_t FfiError_t; enum
#endif
{
/** . */
FFI_ERROR_NONE,
/** . */
FFI_ERROR_INVALID_U32_BYTES,
/** . */
FFI_ERROR_GENERIC,
/** . */
FFI_ERROR_SCRIPT_DOESNT_HAVE_ADDRESS_FORM,
/** . */
FFI_ERROR_SINGLE_RECIPIENT_MULTIPLE_OUTPUTS,
/** . */
FFI_ERROR_SINGLE_RECIPIENT_NO_INPUTS,
/** . */
FFI_ERROR_NO_RECIPIENTS,
/** . */
FFI_ERROR_NO_UTXOS_SELECTED,
/** . */
FFI_ERROR_OUTPUT_BELOW_DUST_LIMIT,
/** . */
FFI_ERROR_INSUFFICIENT_FUNDS,
/** . */
FFI_ERROR_BN_B_TOTAL_TRIES_EXCEEDED,
/** . */
FFI_ERROR_BN_B_NO_EXACT_MATCH,
/** . */
FFI_ERROR_UNKNOWN_UTXO,
/** . */
FFI_ERROR_TRANSACTION_NOT_FOUND,
/** . */
FFI_ERROR_TRANSACTION_CONFIRMED,
/** . */
FFI_ERROR_IRREPLACEABLE_TRANSACTION,
/** . */
FFI_ERROR_FEE_RATE_TOO_LOW,
/** . */
FFI_ERROR_FEE_TOO_LOW,
/** . */
FFI_ERROR_MISSING_KEY_ORIGIN,
/** . */
FFI_ERROR_KEY,
/** . */
FFI_ERROR_CHECKSUM_MISMATCH,
/** . */
FFI_ERROR_SPENDING_POLICY_REQUIRED,
/** . */
FFI_ERROR_INVALID_POLICY_PATH_ERROR,
/** . */
FFI_ERROR_SIGNER,
/** . */
FFI_ERROR_INVALID_PROGRESS_VALUE,
/** . */
FFI_ERROR_PROGRESS_UPDATE_ERROR,
/** . */
FFI_ERROR_INVALID_OUTPOINT,
/** . */
FFI_ERROR_DESCRIPTOR,
/** . */
FFI_ERROR_ADDRESS_VALIDATOR,
/** . */
FFI_ERROR_ENCODE,
/** . */
FFI_ERROR_MINISCRIPT,
/** . */
FFI_ERROR_BIP32,
/** . */
FFI_ERROR_SECP256K1,
/** . */
FFI_ERROR_JSON,
/** . */
FFI_ERROR_HEX,
/** . */
FFI_ERROR_PSBT,
/** . */
FFI_ERROR_ELECTRUM,
/** . */
FFI_ERROR_SLED,
}
#ifdef DOXYGEN
FfiError_t
#endif
;
typedef struct {
char * ok;
FfiError_t err;
} FfiResult_char_ptr_t;
void free_string_result (
FfiResult_char_ptr_t string_result);
typedef struct {
FfiError_t err;
} FfiResultVoid_t;
void free_void_result (
FfiResultVoid_t void_result);
/** \brief
* Free a Rust-allocated string
*/
void free_string (
char * string);
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;
@@ -24,7 +152,7 @@ typedef struct {
OpaqueWallet_t * ok;
char * err;
FfiError_t err;
} FfiResult_OpaqueWallet_ptr_t;
@@ -37,30 +165,12 @@ FfiResult_OpaqueWallet_ptr_t new_wallet_result (
void free_wallet_result (
FfiResult_OpaqueWallet_ptr_t wallet_result);
typedef struct {
char * err;
} FfiResultVoid_t;
FfiResultVoid_t sync_wallet (
OpaqueWallet_t const * opaque_wallet);
typedef struct {
char * ok;
char * err;
} FfiResult_char_ptr_t;
FfiResult_char_ptr_t new_address (
OpaqueWallet_t const * opaque_wallet);
#include <stddef.h>
#include <stdint.h>
typedef struct {
char * txid;
@@ -104,7 +214,7 @@ typedef struct {
Vec_LocalUtxo_t ok;
char * err;
FfiError_t err;
} FfiResult_Vec_LocalUtxo_t;
@@ -114,15 +224,6 @@ FfiResult_Vec_LocalUtxo_t list_unspent (
void free_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);
DatabaseConfig_t * new_sled_config (
@@ -132,18 +233,6 @@ DatabaseConfig_t * new_sled_config (
void free_database_config (
DatabaseConfig_t * database_config);
void free_string_result (
FfiResult_char_ptr_t string_result);
void free_void_result (
FfiResultVoid_t void_result);
/** \brief
* Free a Rust-allocated string
*/
void free_string (
char * string);
#ifdef __cplusplus
} /* extern "C" */

View File

@@ -14,16 +14,11 @@ int main (int argc, char const * const argv[])
// new wallet with bad descriptor
FfiResult_OpaqueWallet_ptr_t wallet_result = new_wallet_result("bad","bad",bc_config,db_config);
assert(strlen(wallet_result.err) > 0);
assert(wallet_result.err == FFI_ERROR_DESCRIPTOR);
assert(wallet_result.ok == NULL);
free_blockchain_config(bc_config);
free_database_config(db_config);
char *wallet_err = wallet_result.err;
assert(wallet_err != NULL);
assert( 0 == strcmp(wallet_err,"Descriptor") );
// printf("wallet err: %s\n", wallet_err);
free_database_config(db_config);
free_wallet_result(wallet_result);
}
@@ -38,8 +33,8 @@ int main (int argc, char const * const argv[])
// new wallet
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);
// printf("wallet_result.err = %d\n", wallet_result.err));
assert(wallet_result.err == FFI_ERROR_NONE);
assert(wallet_result.ok != NULL);
free_blockchain_config(bc_config);
@@ -49,20 +44,20 @@ int main (int argc, char const * const argv[])
// sync wallet
FfiResultVoid_t sync_result = sync_wallet(wallet);
assert(strlen(sync_result.err) == 0);
assert(sync_result.err == FFI_ERROR_NONE);
free_void_result(sync_result);
// new address
FfiResult_char_ptr_t address1_result = new_address(wallet);
assert(address1_result.ok != NULL);
assert(strlen(address1_result.err) == 0);
assert(address1_result.err == FFI_ERROR_NONE);
// printf("address1 = %s\n", *address1_result.ok);
assert( 0 == strcmp(address1_result.ok,"tb1qgkhp034fyxeta00h0nne9tzfm0vsxq4prduzxp"));
free_string_result(address1_result);
FfiResult_char_ptr_t address2_result = new_address(wallet);
assert(address2_result.ok != NULL);
assert(strlen(address2_result.err) == 0);
assert(address2_result.err == FFI_ERROR_NONE);
// printf("address2 = %s\n", *address2_result.ok);
assert( 0 == strcmp(address2_result.ok,"tb1qd6u9q327sru2ljvwzdtfrdg36sapax7udz97wf"));
free_string_result(address2_result);
@@ -87,7 +82,7 @@ int main (int argc, char const * const argv[])
// new wallet
FfiResult_OpaqueWallet_ptr_t wallet_result = new_wallet_result(desc,change,bc_config,db_config);
assert(strlen(wallet_result.err) == 0);
assert(wallet_result.err == FFI_ERROR_NONE);
assert(wallet_result.ok != NULL);
free_blockchain_config(bc_config);
@@ -97,13 +92,13 @@ int main (int argc, char const * const argv[])
// sync wallet
FfiResultVoid_t sync_result = sync_wallet(wallet);
assert(strlen(sync_result.err) == 0);
assert(sync_result.err == FFI_ERROR_NONE);
free_void_result(sync_result);
// list unspent
FfiResult_Vec_LocalUtxo_t unspent_result = list_unspent(wallet);
assert(unspent_result.ok.len == 7);
assert(strlen(unspent_result.err) == 0);
assert(unspent_result.err == FFI_ERROR_NONE);
LocalUtxo_t * unspent_ptr = unspent_result.ok.ptr;
for (int i = 0; i < unspent_result.ok.len; i++) {