Better error management in api

This commit is contained in:
Sosthene00 2024-03-22 12:04:52 +01:00
parent d081bc1f78
commit 70dc18ef97

View File

@ -1,15 +1,49 @@
use rand::Rng; use rand::Rng;
use anyhow::Error as AnyhowError;
use sp_backend::silentpayments::Error as SpError;
use serde_json::Error as SerdeJsonError;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use sp_backend::silentpayments::sending::SilentPaymentAddress; use sp_backend::silentpayments::sending::SilentPaymentAddress;
use wasm_bindgen::prelude::*;
use tsify::Tsify; use tsify::Tsify;
use wasm_bindgen::convert::FromWasmAbi;
use wasm_bindgen::prelude::*;
use sp_backend::spclient::SpendKey; use sp_backend::spclient::SpendKey;
use sp_backend::spclient::{derive_keys_from_seed, SpClient, OutputList}; type ApiResult<T: FromWasmAbi> = Result<T, ApiError>;
const IS_TESTNET: bool = true; const IS_TESTNET: bool = true;
#[derive(Debug)]
struct ApiError {
message: String,
}
impl From<AnyhowError> for ApiError {
fn from(value: AnyhowError) -> Self {
ApiError {message: value.to_string()}
}
}
impl From<SpError> for ApiError {
fn from(value: SpError) -> Self {
ApiError { message: value.to_string() }
}
}
impl From<SerdeJsonError> for ApiError {
fn from(value: SerdeJsonError) -> Self {
ApiError { message: value.to_string() }
}
}
impl Into<JsValue> for ApiError {
fn into(self) -> JsValue {
JsValue::from_str(&self.message)
}
}
#[derive(Tsify, Serialize, Deserialize)] #[derive(Tsify, Serialize, Deserialize)]
#[tsify(into_wasm_abi)] #[tsify(into_wasm_abi)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
@ -24,36 +58,43 @@ pub fn setup() {
} }
#[wasm_bindgen] #[wasm_bindgen]
pub fn generate_sp_wallet(label: Option<String>, birthday: u32, is_testnet: bool) -> Option<generate_sp_wallet_return> { pub fn generate_sp_wallet(
label: Option<String>,
birthday: u32,
is_testnet: bool,
) -> ApiResult<generate_sp_wallet_return> {
let mut seed = [0u8; 64]; let mut seed = [0u8; 64];
rand::thread_rng().fill(&mut seed); rand::thread_rng().fill(&mut seed);
let (scan_sk, spend_sk) = derive_keys_from_seed(&seed, is_testnet).ok()?; let (scan_sk, spend_sk) = derive_keys_from_seed(&seed, is_testnet)?;
let sp_client = SpClient::new( let sp_client = SpClient::new(
label.unwrap_or("default".into()), label.unwrap_or("default".into()),
scan_sk, scan_sk,
SpendKey::Secret(spend_sk), SpendKey::Secret(spend_sk),
None, None,
IS_TESTNET, IS_TESTNET,
) )?;
.ok()?; let our_address: SilentPaymentAddress = sp_client.get_receiving_address().try_into()?;
let our_address: SilentPaymentAddress = sp_client.get_receiving_address().try_into().ok()?;
log::info!( log::info!(
"Created client for sp with address: {}", "Created client for sp with address: {}",
our_address.to_string() our_address.to_string()
); );
let sp_client_json = serde_json::to_string(&sp_client).ok()?; let sp_client_json = serde_json::to_string(&sp_client)?;
// Generate an empty outputs // Generate an empty outputs
let sp_outputs = OutputList::new(our_address.get_scan_key(), our_address.get_spend_key(), birthday); let sp_outputs = OutputList::new(
let sp_outputs_json = serde_json::to_string(&sp_outputs).ok()?; our_address.get_scan_key(),
our_address.get_spend_key(),
birthday,
);
let sp_outputs_json = serde_json::to_string(&sp_outputs)?;
let res = generate_sp_wallet_return { let res = generate_sp_wallet_return {
sp_client_json, sp_client_json,
sp_outputs_json sp_outputs_json,
}; };
Some(res) Ok(res)
} }
#[wasm_bindgen] #[wasm_bindgen]