hakuban 0.7.2

Data-object sharing library
Documentation
#![allow(clippy::not_unsafe_ptr_arg_deref)]
use std::{ffi::c_void, mem::forget};

use futures::{FutureExt, StreamExt};

use super::{ffi_future::FFIFuture, FFIOwnedArray, FFITagDescriptor};
use crate::{object::ObjectStateStream, LocalExchange, TagObserveContract};


#[no_mangle]
pub extern "C" fn hakuban_tag_observe_contract_new(local_exchange: *mut LocalExchange, descriptor: *mut FFITagDescriptor) -> *mut TagObserveContract {
	let local_exchange = unsafe { local_exchange.as_mut().unwrap() };
	let descriptor = unsafe { descriptor.as_mut().unwrap() };
	Box::into_raw(Box::new(local_exchange.tag(descriptor.descriptor.clone()).observe()))
}


#[no_mangle]
pub extern "C" fn hakuban_tag_observe_contract_drop(tag_pointer: *mut TagObserveContract) {
	drop(unsafe { Box::from_raw(tag_pointer) });
}


#[no_mangle]
pub extern "C" fn hakuban_tag_observe_contract_terminate(tag_observe_pointer: *mut TagObserveContract) {
	let tag_observe: &mut TagObserveContract = unsafe { tag_observe_pointer.as_mut().unwrap() };
	tag_observe.terminate();
}


#[no_mangle]
pub extern "C" fn hakuban_tag_observe_contract_next(tag_observe_pointer: *mut TagObserveContract) -> *mut FFIFuture<*mut ObjectStateStream> {
	let tag_observe: &mut TagObserveContract = unsafe { tag_observe_pointer.as_mut().unwrap() };
	Box::into_raw(Box::new(FFIFuture::new(tag_observe.next().map(|item| item.map(|object_state_stream| Box::into_raw(Box::new(object_state_stream))).into()))))
}


#[no_mangle]
pub extern "C" fn hakuban_tag_observe_contract_ready(tag_observe_pointer: *mut TagObserveContract) -> FFIOwnedArray {
	let tag_observe: &mut TagObserveContract = unsafe { tag_observe_pointer.as_mut().unwrap() };
	let mut ready_streams: Vec<*mut ObjectStateStream> =
		tag_observe.ready().into_iter().map(|object_state_stream| Box::into_raw(Box::new(object_state_stream))).collect();
	ready_streams.shrink_to_fit();
	//TODO: .into_raw_parts()
	let ret = FFIOwnedArray { length: ready_streams.len(), pointer: ready_streams.as_mut_ptr() as *mut c_void };
	forget(ready_streams);
	ret
}