transaction-processor 0.0.1

Write transaction processors for Wavelet in Rust.
Documentation
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)
    }
}