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}