ergo/
input.rs

1//! Ergo input
2use std::{ffi::CString, os::raw::c_char};
3
4use ergo_lib_c_core::{
5    context_extension::ContextExtensionPtr, ergo_box::BoxIdPtr, input::*, Error,
6};
7
8use crate::{delete_ptr, ErrorPtr};
9use paste::paste;
10
11// `UnsignedInput` bindings -------------------------------------------------------------------------
12
13/// Get box id
14#[no_mangle]
15pub unsafe extern "C" fn ergo_lib_unsigned_input_box_id(
16    unsigned_input_ptr: ConstUnsignedInputPtr,
17    box_id_out: *mut BoxIdPtr,
18) {
19    #[allow(clippy::unwrap_used)]
20    unsigned_input_box_id(unsigned_input_ptr, box_id_out).unwrap();
21}
22
23/// Get extension
24#[no_mangle]
25pub unsafe extern "C" fn ergo_lib_unsigned_input_context_extension(
26    unsigned_input_ptr: ConstUnsignedInputPtr,
27    context_extension_out: *mut ContextExtensionPtr,
28) {
29    #[allow(clippy::unwrap_used)]
30    unsigned_input_context_extension(unsigned_input_ptr, context_extension_out).unwrap();
31}
32
33/// Drop `UnsignedInput`
34#[no_mangle]
35pub unsafe extern "C" fn ergo_lib_unsigned_input_delete(ptr: UnsignedInputPtr) {
36    delete_ptr(ptr)
37}
38
39make_collection!(UnsignedInputs, UnsignedInput);
40
41// `Input` bindings --------------------------------------------------------------------------------
42
43/// Get box id
44#[no_mangle]
45pub unsafe extern "C" fn ergo_lib_input_box_id(
46    input_ptr: ConstInputPtr,
47    box_id_out: *mut BoxIdPtr,
48) {
49    #[allow(clippy::unwrap_used)]
50    input_box_id(input_ptr, box_id_out).unwrap();
51}
52
53/// Get spending proof
54#[no_mangle]
55pub unsafe extern "C" fn ergo_lib_input_spending_proof(
56    input_ptr: ConstInputPtr,
57    prover_result_out: *mut ProverResultPtr,
58) {
59    #[allow(clippy::unwrap_used)]
60    input_spending_proof(input_ptr, prover_result_out).unwrap();
61}
62
63/// Drop `Input`
64#[no_mangle]
65pub unsafe extern "C" fn ergo_lib_input_delete(ptr: InputPtr) {
66    delete_ptr(ptr)
67}
68
69make_collection!(Inputs, Input);
70
71// `ProverResult` bindings -------------------------------------------------------------------------
72
73/// Return the number of bytes that make up the proof.
74#[no_mangle]
75pub unsafe extern "C" fn ergo_lib_prover_result_proof_len(
76    prover_result_ptr: ConstProverResultPtr,
77) -> usize {
78    #[allow(clippy::unwrap_used)]
79    prover_result_proof_len(prover_result_ptr).unwrap()
80}
81
82/// Get proof. Key assumption: enough memory has been allocated at the address pointed-to by
83/// `output`. Use `ergo_lib_prover_result_proof_len` to determine the length of the byte
84/// array.
85#[no_mangle]
86pub unsafe extern "C" fn ergo_lib_prover_result_proof(
87    prover_result_ptr: ConstProverResultPtr,
88    output: *mut u8,
89) {
90    #[allow(clippy::unwrap_used)]
91    prover_result_proof(prover_result_ptr, output).unwrap();
92}
93
94/// Get extension
95#[no_mangle]
96pub unsafe extern "C" fn ergo_lib_prover_result_context_extension(
97    prover_result_ptr: ConstProverResultPtr,
98    context_extension_out: *mut ContextExtensionPtr,
99) {
100    #[allow(clippy::unwrap_used)]
101    prover_result_context_extension(prover_result_ptr, context_extension_out).unwrap();
102}
103
104/// JSON representation as text (compatible with Ergo Node/Explorer API, numbers are encoded as numbers)
105#[no_mangle]
106pub unsafe extern "C" fn ergo_lib_prover_result_to_json(
107    prover_result_ptr: ConstProverResultPtr,
108    _json_str: *mut *const c_char,
109) -> ErrorPtr {
110    #[allow(clippy::unwrap_used)]
111    let res = match prover_result_to_json(prover_result_ptr) {
112        Ok(s) => {
113            *_json_str = CString::new(s).unwrap().into_raw();
114            Ok(())
115        }
116        Err(e) => Err(e),
117    };
118    Error::c_api_from(res)
119}
120
121/// Drop `ProverResult`
122#[no_mangle]
123pub unsafe extern "C" fn ergo_lib_prover_result_delete(ptr: ProverResultPtr) {
124    delete_ptr(ptr)
125}