phlow-ffi 3.0.0

Provides C-like api to the phlow crates
Documentation
use phlow::{AnySendObject, ListViewInstance, ViewInstance};
use string_box::StringBox;
use value_box::{BorrowedPtr, BoxerError, OwnedPtr, ReturnBoxerResult};

use crate::with_view_instance;

#[unsafe(no_mangle)]
pub extern "C" fn phlow_list_view_instance_get_items_count(
    view_instance: BorrowedPtr<Box<dyn ViewInstance>>,
) -> usize {
    with_view_instance(view_instance, |view_instance: &ListViewInstance| {
        Ok(view_instance.items_count())
    })
    .or_log(0)
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_list_view_instance_get_item_text_at(
    view_instance: BorrowedPtr<Box<dyn ViewInstance>>,
    index: usize,
    mut item_text: BorrowedPtr<StringBox>,
) {
    with_view_instance(view_instance, |view_instance: &ListViewInstance| {
        view_instance
            .get_item_text(index)
            .ok_or_else(|| {
                BoxerError::AnyError(format!("List item at {} does not exist", index).into())
            })
            .and_then(|text| item_text.with_mut_ok(|item_text| item_text.set_string(text.clone())))
    })
    .log();
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_list_view_instance_get_send_at(
    view_instance: BorrowedPtr<Box<dyn ViewInstance>>,
    index: usize,
) -> OwnedPtr<AnySendObject> {
    with_view_instance(view_instance, |view_instance: &ListViewInstance| {
        view_instance
            .get_item_to_send(index)
            .ok_or_else(|| BoxerError::AnyError(format!("Item at {} does not exist", index).into()))
            .map(OwnedPtr::new)
    })
    .or_log(OwnedPtr::null())
}