1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use elrond_codec::{EncodeError, TopEncode};

use crate::{
    api::{ErrorApi, LogApi, ManagedTypeApi},
    err_msg,
    types::{ManagedBuffer, ManagedType, ManagedVec},
};

pub fn event_topic_accumulator<A>(
    api: A,
    event_identifier: &[u8],
) -> ManagedVec<A, ManagedBuffer<A>>
where
    A: ErrorApi + ManagedTypeApi,
{
    let mut accumulator = ManagedVec::new(api.clone());
    accumulator.push(ManagedBuffer::new_from_bytes(api, event_identifier));
    accumulator
}

pub fn serialize_event_topic<A, T>(accumulator: &mut ManagedVec<A, ManagedBuffer<A>>, topic: T)
where
    A: ErrorApi + ManagedTypeApi,
    T: TopEncode,
{
    let mut topic_buffer = ManagedBuffer::new(accumulator.type_manager());
    topic.top_encode_or_exit(
        &mut topic_buffer,
        accumulator.type_manager(),
        serialize_log_topic_exit,
    );
    accumulator.push(topic_buffer);
}

#[inline(always)]
fn serialize_log_topic_exit<A>(api: A, encode_err: EncodeError) -> !
where
    A: ErrorApi + ManagedTypeApi + 'static,
{
    let mut message_buffer =
        ManagedBuffer::new_from_bytes(api.clone(), err_msg::LOG_TOPIC_ENCODE_ERROR);
    message_buffer.append_bytes(encode_err.message_bytes());
    api.signal_error_from_buffer(message_buffer.get_raw_handle())
}

pub fn serialize_log_data<T, A>(api: A, data: T) -> ManagedBuffer<A>
where
    T: TopEncode,
    A: ErrorApi + ManagedTypeApi + Clone + 'static,
{
    let mut data_buffer = ManagedBuffer::new(api.clone());
    data.top_encode_or_exit(&mut data_buffer, api, serialize_log_data_exit);
    data_buffer
}

#[inline(always)]
fn serialize_log_data_exit<A>(api: A, encode_err: EncodeError) -> !
where
    A: ErrorApi + ManagedTypeApi + 'static,
{
    let mut message_buffer =
        ManagedBuffer::new_from_bytes(api.clone(), err_msg::LOG_DATA_ENCODE_ERROR);
    message_buffer.append_bytes(encode_err.message_bytes());
    api.signal_error_from_buffer(message_buffer.get_raw_handle())
}

pub fn write_log<L, A>(api: L, topics: &ManagedVec<A, ManagedBuffer<A>>, data: &ManagedBuffer<A>)
where
    L: LogApi,
    A: ErrorApi + ManagedTypeApi,
{
    api.managed_write_log(topics.get_raw_handle(), data.get_raw_handle());
}