hakuban 0.7.2

Data-object sharing library
Documentation
#![allow(clippy::not_unsafe_ptr_arg_deref)]

use std::sync::Arc;

use instant::Instant;
use log::error;
use wasm_bindgen::prelude::*;

use super::WasmResultWithPointer;
use crate::{object::ObjectState, DataBytes, DataSynchronized};


#[allow(clippy::boxed_local)]
#[wasm_bindgen]
pub fn hakuban_object_state_new(version: Box<[i64]>, format_jsvalues: Box<[JsValue]>, data: Box<[u8]>, synchronized_us_ago: u64) -> WasmResultWithPointer {
	let mut format: Vec<String> = vec![];
	for entry in format_jsvalues.iter() {
		if let Some(format_element) = entry.as_string() {
			format.push(format_element);
		} else {
			error!("Value submitted as part of format array is not a string.");
			return WasmResultWithPointer::error(super::WasmResultStatus::InvalidString);
		}
	}

	let serialized_data: Arc<Vec<u8>> = Arc::new(data.into());

	let synchronized = match synchronized_us_ago {
		0 => DataSynchronized::Now,
		microseconds => DataSynchronized::LastAt(Instant::now() - std::time::Duration::from_micros(microseconds)),
	};

	let object_state = ObjectState { data: serialized_data, version: version.into(), format, synchronized };
	WasmResultWithPointer::ok(Box::into_raw(Box::new(object_state)))
}


#[wasm_bindgen]
pub fn hakuban_object_state_drop(object_state_pointer: *mut ObjectState<DataBytes>) {
	drop(unsafe { Box::from_raw(object_state_pointer) });
}


#[wasm_bindgen]
pub fn hakuban_object_state_version(object_state_pointer: *mut ObjectState<DataBytes>) -> Box<[i64]> {
	let object_state = unsafe { object_state_pointer.as_mut().unwrap() };
	object_state.version.clone().into()
}


#[wasm_bindgen]
pub fn hakuban_object_state_synchronized_ago(object_state_pointer: *mut ObjectState<DataBytes>) -> u64 {
	let object_state = unsafe { object_state_pointer.as_mut().unwrap() };
	object_state.synchronized.micros_ago()
}


#[wasm_bindgen]
pub fn hakuban_object_state_format(object_state_pointer: *mut ObjectState<DataBytes>) -> Box<[JsValue]> {
	let object_state = unsafe { object_state_pointer.as_mut().unwrap() };
	object_state.format.clone().into_iter().map(JsValue::from).collect()
}

#[wasm_bindgen]
pub fn hakuban_object_state_data(object_state_pointer: *mut ObjectState<DataBytes>) -> Box<[u8]> {
	let object_state = unsafe { object_state_pointer.as_mut().unwrap() };
	(*object_state.data).clone().into_boxed_slice()
}