use sys;
use types::*;
pub struct TransactionContext {
pub tag: String,
pub payload: Vec<u8>,
}
impl TransactionContext {
pub fn initial_read() -> ProcessResult<TransactionContext> {
unsafe fn read_static_bytearray(
read: unsafe extern "C" fn(*mut u8),
len: unsafe extern "C" fn() -> usize,
) -> Vec<u8> {
let len = len();
let mut value: Vec<u8> = Vec::with_capacity(len);
value.set_len(len);
read(value.as_mut_ptr());
value
}
Ok(TransactionContext {
tag: match String::from_utf8(unsafe { read_static_bytearray(sys::_tag, sys::_tag_len) })
{
Ok(v) => v,
Err(_) => return Err(ProcessError::InvalidData),
},
payload: unsafe { read_static_bytearray(sys::_payload, sys::_payload_len) },
})
}
pub fn read_payload<T: for<'a> ::serde::Deserialize<'a>>(&self) -> ProcessResult<T> {
::serde_json::from_slice(&self.payload).map_err(|_| ProcessError::InvalidData)
}
}