transaction_processor/
startup.rs1use sys;
2use types::*;
3
4pub struct TransactionContext {
5    pub tag: String,
6    pub payload: Vec<u8>,
7}
8
9impl TransactionContext {
10    pub fn initial_read() -> ProcessResult<TransactionContext> {
11        unsafe fn read_static_bytearray(
12            read: unsafe extern "C" fn(*mut u8),
13            len: unsafe extern "C" fn() -> usize,
14        ) -> Vec<u8> {
15            let len = len();
16            let mut value: Vec<u8> = Vec::with_capacity(len);
17            value.set_len(len);
18            read(value.as_mut_ptr());
19            value
20        }
21
22        Ok(TransactionContext {
23            tag: match String::from_utf8(unsafe { read_static_bytearray(sys::_tag, sys::_tag_len) })
24            {
25                Ok(v) => v,
26                Err(_) => return Err(ProcessError::InvalidData),
27            },
28            payload: unsafe { read_static_bytearray(sys::_payload, sys::_payload_len) },
29        })
30    }
31
32    pub fn read_payload<T: for<'a> ::serde::Deserialize<'a>>(&self) -> ProcessResult<T> {
33        ::serde_json::from_slice(&self.payload).map_err(|_| ProcessError::InvalidData)
34    }
35}