ergo_lib_c_core/
block_header.rs1use std::convert::{TryFrom, TryInto};
4
5use crate::{
6 error::*,
7 util::{const_ptr_as_ref, mut_ptr_as_mut},
8};
9use ergo_lib::ergo_chain_types::{Base16DecodedBytes, Header};
10
11#[derive(PartialEq, Eq, Debug, Clone)]
13pub struct BlockHeader(pub Header);
14pub type BlockHeaderPtr = *mut BlockHeader;
15pub type ConstBlockHeaderPtr = *const BlockHeader;
16
17pub unsafe fn block_header_from_json(
19 json: &str,
20 block_header_out: *mut BlockHeaderPtr,
21) -> Result<(), Error> {
22 let block_header_out = mut_ptr_as_mut(block_header_out, "block_header_out")?;
23 let header = serde_json::from_str(json).map(BlockHeader)?;
24 *block_header_out = Box::into_raw(Box::new(header));
25 Ok(())
26}
27
28pub unsafe fn block_header_id(
30 block_header_ptr: ConstBlockHeaderPtr,
31 block_id_out: *mut BlockIdPtr,
32) -> Result<(), Error> {
33 let block_header = const_ptr_as_ref(block_header_ptr, "block_header_ptr")?;
34 let block_id_out = mut_ptr_as_mut(block_id_out, "block_id_out")?;
35 *block_id_out = Box::into_raw(Box::new(BlockId(block_header.0.id)));
36 Ok(())
37}
38
39pub unsafe fn block_header_transactions_root(
42 block_header_ptr: ConstBlockHeaderPtr,
43 output: *mut u8,
44) -> Result<(), Error> {
45 let block_header = const_ptr_as_ref(block_header_ptr, "block_header_ptr")?;
46 let src = Vec::<u8>::from(block_header.0.transaction_root);
47 std::ptr::copy_nonoverlapping(src.as_ptr(), output, src.len());
48 Ok(())
49}
50
51#[derive(PartialEq, Eq, Debug, Clone)]
53pub struct BlockId(pub(crate) ergo_lib::ergo_chain_types::BlockId);
54
55pub type BlockIdPtr = *mut BlockId;
56pub type ConstBlockIdPtr = *const BlockId;
57
58pub unsafe fn block_id_from_str(str: &str, block_id_out: *mut BlockIdPtr) -> Result<(), Error> {
60 let block_id_out = mut_ptr_as_mut(block_id_out, "block_id_out")?;
61 let bytes = Base16DecodedBytes::try_from(str.to_string())?;
62 let block_id = bytes
63 .try_into()
64 .map(|digest| BlockId(ergo_lib::ergo_chain_types::BlockId(digest)))?;
65 *block_id_out = Box::into_raw(Box::new(block_id));
66 Ok(())
67}