use crate::{delete_ptr, ErrorPtr};
use ergo_lib_c_core::{merkleproof::*, Error};
use std::convert::TryFrom;
use std::{
ffi::{CStr, CString},
os::raw::c_char,
};
#[no_mangle]
pub unsafe extern "C" fn ergo_merkle_proof_new(
leaf_data: *const u8,
len: usize,
proof_out: *mut MerkleProofPtr,
) -> ErrorPtr {
let leaf_data = std::slice::from_raw_parts(leaf_data, len);
Error::c_api_from(merkleproof_new(leaf_data, proof_out))
}
#[no_mangle]
pub unsafe extern "C" fn ergo_merkle_proof_add_node(
proof: MerkleProofPtr,
hash: *const u8,
hash_len: usize,
side: u8,
) -> ErrorPtr {
let hash = std::slice::from_raw_parts(hash, hash_len);
let side = match NodeSide::try_from(side) {
Ok(side) => side,
Err(err) => return Error::c_api_from(Err(Error::InvalidArgument(err))),
};
Error::c_api_from(merkleproof_add_node(proof, hash, side))
}
#[no_mangle]
pub unsafe extern "C" fn ergo_merkle_proof_valid(
proof: ConstMerkleProofPtr,
root_hash: *const u8,
len: usize,
) -> bool {
let root_hash = std::slice::from_raw_parts(root_hash, len);
#[allow(clippy::unwrap_used)]
merkleproof_valid(proof, root_hash).unwrap()
}
#[no_mangle]
pub unsafe extern "C" fn ergo_merkle_proof_valid_base16(
proof: ConstMerkleProofPtr,
root_hash: *const c_char,
valid: *mut bool,
) -> ErrorPtr {
let root_hash = CStr::from_ptr(root_hash).to_string_lossy();
let res = match merkleproof_valid_base16(proof, &root_hash) {
Ok(res) => {
*valid = res;
Ok(())
}
Err(err) => Err(err),
};
Error::c_api_from(res)
}
#[no_mangle]
pub unsafe extern "C" fn ergo_merkle_proof_from_json(
json_str: *const c_char,
proof_out: *mut MerkleProofPtr,
) -> ErrorPtr {
let json_str = CStr::from_ptr(json_str).to_string_lossy();
Error::c_api_from(merkleproof_from_json(&json_str, proof_out))
}
#[no_mangle]
pub unsafe extern "C" fn ergo_merkle_proof_to_json(
proof: ConstMerkleProofPtr,
json_str: *mut *const c_char,
) -> ErrorPtr {
#[allow(clippy::unwrap_used)]
let res = match merkleproof_to_json(proof) {
Ok(s) => {
*json_str = CString::new(s).unwrap().into_raw();
Ok(())
}
Err(err) => Err(err),
};
Error::c_api_from(res)
}
#[no_mangle]
pub unsafe extern "C" fn ergo_merkle_proof_delete(proof: MerkleProofPtr) {
delete_ptr(proof)
}