#![allow(clippy::not_unsafe_ptr_arg_deref)]
use futures::{stream::StreamExt, FutureExt};
use super::{ffi_future::FFIFuture, FFIObjectDescriptor, FFIResult};
use crate::{object::ObjectStateStream, LocalExchange, ObjectObserveContract};
#[no_mangle]
pub extern "C" fn hakuban_object_observe_contract_new(local_exchange: *mut LocalExchange, descriptor: *mut FFIObjectDescriptor) -> *mut ObjectObserveContract {
let local_exchange = unsafe { local_exchange.as_mut().unwrap() };
let descriptor = unsafe { descriptor.as_mut().unwrap() };
Box::into_raw(Box::new(local_exchange.object(descriptor.descriptor.clone()).observe()))
}
#[no_mangle]
pub extern "C" fn hakuban_object_observe_contract_drop(object_ptr: *mut ObjectObserveContract) {
drop(unsafe { Box::from_raw(object_ptr) });
}
#[no_mangle]
pub extern "C" fn hakuban_object_observe_contract_terminate(object_observe_pointer: *mut ObjectObserveContract) {
let object_observe: &mut ObjectObserveContract = unsafe { object_observe_pointer.as_mut().unwrap() };
object_observe.terminate();
}
#[no_mangle]
pub extern "C" fn hakuban_object_observe_contract_next(object_observe_pointer: *mut ObjectObserveContract) -> *mut FFIFuture<*mut ObjectStateStream> {
let object_observe: &mut ObjectObserveContract = unsafe { object_observe_pointer.as_mut().unwrap() };
Box::into_raw(Box::new(FFIFuture::new(
object_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_object_observe_contract_ready(object_observe_pointer: *mut ObjectObserveContract) -> FFIResult<*mut ObjectStateStream> {
let object_observe: &mut ObjectObserveContract = unsafe { object_observe_pointer.as_mut().unwrap() };
if let Some(streams) = object_observe.ready() {
FFIResult::ok(Box::into_raw(Box::new(streams)))
} else {
FFIResult::error(super::FFIResultStatus::NotAvailable)
}
}