Skip to content

Commit

Permalink
Add better error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
brianp committed Apr 26, 2023
1 parent 739303a commit aded7ec
Show file tree
Hide file tree
Showing 6 changed files with 304 additions and 75 deletions.
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions base_layer/chat_ffi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ tari_contacts = { path = "../contacts" }
tari_p2p = { path = "../p2p" }

libc = "0.2.65"
log = "0.4.6"
serde_json = "1.0.64"
thiserror = "1.0.26"
tokio = "1.23"

[target.'cfg(target_os="android")'.dependencies]
Expand Down
28 changes: 20 additions & 8 deletions base_layer/chat_ffi/chat.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ struct ChatMessages;

struct ClientFFI;

struct ClientPeers;

/**
* Configuration for a comms node
*/
Expand All @@ -35,19 +37,21 @@ extern "C" {
* `db_path` - The path to the db file
* `seed_peers` - A ptr to a collection of seed peers
* `network_str` - The network to connect to
* `error_out` - Pointer to an int which will be modified
*
* ## Returns
* `*mut ChatClient` - Returns a pointer to a ChatClient, note that it returns ptr::null_mut()
* if config is null, an error was encountered or if the runtime could not be created
* if any error was encountered or if the runtime could not be created.
*
* # Safety
* The ```destroy_client``` method must be called when finished with a ClientFFI to prevent a memory leak
*/
struct ClientFFI *create_chat_client(struct P2pConfig *config,
const char *identity_file_path,
const char *db_path,
Peer **seed_peers,
const char *network_str);
struct ClientPeers *seed_peers,
const char *network_str,
int *error_out);

/**
* Frees memory for a ClientFFI
Expand All @@ -70,6 +74,7 @@ void destroy_client_ffi(struct ClientFFI *client);
* `client` - The Client pointer
* `receiver` - A string containing a tari address
* `message` - The peer seeds config for the node
* `error_out` - Pointer to an int which will be modified
*
* ## Returns
* `()` - Does not return a value, equivalent to void in C
Expand All @@ -79,44 +84,48 @@ void destroy_client_ffi(struct ClientFFI *client);
*/
void send_message(struct ClientFFI *client,
struct TariAddress *receiver,
const char *message_c_char);
const char *message_c_char,
int *error_out);

/**
* Add a contact
*
* ## Arguments
* `client` - The Client pointer
* `address` - A TariAddress ptr
* `error_out` - Pointer to an int which will be modified
*
* ## Returns
* `()` - Does not return a value, equivalent to void in C
*
* # Safety
* The ```address``` should be destroyed after use
*/
void add_contact(struct ClientFFI *client, struct TariAddress *receiver);
void add_contact(struct ClientFFI *client, struct TariAddress *receiver, int *error_out);

/**
* Check the online status of a contact
*
* ## Arguments
* `client` - The Client pointer
* `address` - A TariAddress ptr
* `error_out` - Pointer to an int which will be modified
*
* ## Returns
* `()` - Does not return a value, equivalent to void in C
*
* # Safety
* The ```address``` should be destroyed after use
*/
int check_online_status(struct ClientFFI *client, struct TariAddress *receiver);
int check_online_status(struct ClientFFI *client, struct TariAddress *receiver, int *error_out);

/**
* Get a ptr to all messages from or to address
*
* ## Arguments
* `client` - The Client pointer
* `address` - A TariAddress ptr
* `error_out` - Pointer to an int which will be modified
*
* ## Returns
* `()` - Does not return a value, equivalent to void in C
Expand All @@ -125,7 +134,9 @@ int check_online_status(struct ClientFFI *client, struct TariAddress *receiver);
* The ```address``` should be destroyed after use
* The returned pointer to ```*mut ChatMessages``` should be destroyed after use
*/
struct ChatMessages *get_all_messages(struct ClientFFI *client, struct TariAddress *address);
struct ChatMessages *get_all_messages(struct ClientFFI *client,
struct TariAddress *address,
int *error_out);

/**
* Frees memory for messages
Expand All @@ -146,14 +157,15 @@ void destroy_messages(struct ChatMessages *messages_ptr);
*
* ## Arguments
* `receiver_c_char` - A string containing a tari address hex value
* `error_out` - Pointer to an int which will be modified
*
* ## Returns
* `*mut TariAddress` - A ptr to a TariAddress
*
* # Safety
* The ```destroy_tari_address``` function should be called when finished with the TariAddress
*/
struct TariAddress *create_tari_address(const char *receiver_c_char);
struct TariAddress *create_tari_address(const char *receiver_c_char, int *error_out);

/**
* Frees memory for a TariAddress
Expand Down
63 changes: 63 additions & 0 deletions base_layer/chat_ffi/src/error.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Copyright 2023. The Tari Project
//
// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
// following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
// disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
// following disclaimer in the documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
// products derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use log::*;
use thiserror::Error;

const LOG_TARGET: &str = "chat_ffi::error";

#[derive(Debug, Error, PartialEq)]
pub enum InterfaceError {
#[error("An error has occurred due to one of the parameters being null: `{0}`")]
NullError(String),
#[error("An error has occurred when trying to create the tokio runtime: `{0}`")]
TokioError(String),
#[error("Emoji ID is invalid")]
InvalidArgument(String),
}

/// This struct is meant to hold an error for use by FFI client applications. The error has an integer code and string
/// message
#[derive(Debug, Clone)]
pub struct LibChatError {
pub code: i32,
pub message: String,
}

impl From<InterfaceError> for LibChatError {
fn from(v: InterfaceError) -> Self {
error!(target: LOG_TARGET, "{}", format!("{:?}", v));
match v {
InterfaceError::NullError(_) => Self {
code: 1,
message: format!("{:?}", v),
},
InterfaceError::TokioError(_) => Self {
code: 4,
message: format!("{:?}", v),
},
InterfaceError::InvalidArgument(_) => Self {
code: 7,
message: format!("{:?}", v),
},
}
}
}

0 comments on commit aded7ec

Please sign in to comment.