ergo/
block_header.rs

1//! Block header
2use paste::paste;
3
4use ergo_lib_c_core::{
5    block_header::{
6        block_header_from_json, block_header_id, block_header_transactions_root, block_id_from_str,
7        BlockHeader, BlockHeaderPtr, BlockId, BlockIdPtr, ConstBlockHeaderPtr, ConstBlockIdPtr,
8    },
9    Error,
10};
11use std::{ffi::CStr, os::raw::c_char};
12
13use crate::{delete_ptr, ErrorPtr};
14
15/// Parse BlockHeader array from JSON (Node API)
16#[no_mangle]
17pub unsafe extern "C" fn ergo_lib_block_header_from_json(
18    json_str: *const c_char,
19    block_header_out: *mut BlockHeaderPtr,
20) -> ErrorPtr {
21    let json = CStr::from_ptr(json_str).to_string_lossy();
22    let res = block_header_from_json(&json, block_header_out);
23    Error::c_api_from(res)
24}
25
26/// Get `BlockHeader`s id
27#[no_mangle]
28pub unsafe extern "C" fn ergo_lib_block_header_id(
29    block_header_ptr: ConstBlockHeaderPtr,
30    block_id_out: *mut BlockIdPtr,
31) {
32    #[allow(clippy::unwrap_used)]
33    block_header_id(block_header_ptr, block_id_out).unwrap();
34}
35
36/// Copy the contents of `transactions_root` field to `output`. Key assumption: exactly 32 bytes of
37/// memory have been allocated at the address pointed-to by `output`.
38#[no_mangle]
39pub unsafe extern "C" fn ergo_lib_block_header_transactions_root(
40    block_header_ptr: ConstBlockHeaderPtr,
41    output: *mut u8,
42) -> ErrorPtr {
43    let res = block_header_transactions_root(block_header_ptr, output);
44    Error::c_api_from(res)
45}
46
47/// Delete `BlockHeader`
48#[no_mangle]
49pub unsafe extern "C" fn ergo_lib_block_header_delete(ptr: BlockHeaderPtr) {
50    delete_ptr(ptr)
51}
52
53/// Convert a hex string into a BlockId
54#[no_mangle]
55pub unsafe extern "C" fn ergo_lib_block_id_from_str(
56    str: *const c_char,
57    tx_id_out: *mut BlockIdPtr,
58) -> ErrorPtr {
59    let str = CStr::from_ptr(str).to_string_lossy();
60    let res = block_id_from_str(&str, tx_id_out);
61    Error::c_api_from(res)
62}
63
64/// Delete `BlockId`
65#[no_mangle]
66pub unsafe extern "C" fn ergo_lib_block_id_delete(ptr: BlockIdPtr) {
67    delete_ptr(ptr)
68}
69
70make_collection!(BlockHeaders, BlockHeader);
71make_ffi_eq!(BlockHeader);
72make_collection!(BlockIds, BlockId);
73make_ffi_eq!(BlockId);