phlow-ffi 3.0.0

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

use phlow::{AnySendObject, ObjectRef, PhlowView, ViewInstance};

#[unsafe(no_mangle)]
pub extern "C" fn phlow_view_get_type(
    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
    mut view_type: BorrowedPtr<StringBox>,
) {
    phlow_view
        .with_ref(|phlow_view| {
            view_type.with_mut_ok(|view_type| {
                view_type.set_string(phlow_view.get_view_type().to_string())
            })
        })
        .log();
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_view_get_title(
    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
    mut view_title: BorrowedPtr<StringBox>,
) {
    phlow_view
        .with_ref(|phlow_view| {
            view_title
                .with_mut_ok(|view_title| view_title.set_string(phlow_view.get_title().to_string()))
        })
        .log();
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_view_get_priority(phlow_view: BorrowedPtr<Box<dyn PhlowView>>) -> usize {
    phlow_view
        .with_ref_ok(|phlow_view| phlow_view.get_priority())
        .or_log(0)
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_view_get_source_code(
    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
    mut source_code: BorrowedPtr<StringBox>,
) {
    phlow_view
        .with_ref(|phlow_view| {
            source_code.with_mut_ok(|source_code| {
                source_code.set_string(
                    phlow_view
                        .get_defining_method()
                        .map(|method| method.name())
                        .unwrap_or_default()
                        .to_string(),
                )
            })
        })
        .log();
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_view_create_instance_for_typed_object(
    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
    object: ErasedBorrowedPtr,
) -> OwnedPtr<Box<dyn ViewInstance>> {
    phlow_view
        .with_ref(|phlow_view| {
            object.with_ptr_ok(|ptr| unsafe {
                OwnedPtr::new(ObjectRef::with_erased_ptr(ptr, |object| {
                    phlow_view.create_instance(object)
                }))
            })
        })
        .or_log(OwnedPtr::null())
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_view_create_instance_for_any_object(
    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
    object: BorrowedPtr<AnySendObject>,
) -> OwnedPtr<Box<dyn ViewInstance>> {
    phlow_view
        .with_ref(|phlow_view| {
            object.with_ref_ok(|ptr| {
                OwnedPtr::new(ObjectRef::with_any(ptr.as_any(), |object| {
                    phlow_view.create_instance(object)
                }))
            })
        })
        .or_log(OwnedPtr::null())
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_view_drop(phlow_view: OwnedPtr<Box<dyn PhlowView>>) {
    drop(phlow_view);
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_any_send_object_drop(object: OwnedPtr<AnySendObject>) {
    drop(object);
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_views_pop(
    mut phlow_views: BorrowedPtr<Vec<Box<dyn PhlowView>>>,
) -> OwnedPtr<Box<dyn PhlowView>> {
    phlow_views
        .with_mut_ok(|phlow_views| phlow_views.pop())
        .map(|view| view.map_or(OwnedPtr::null(), OwnedPtr::new))
        .or_log(OwnedPtr::null())
}

#[unsafe(no_mangle)]
pub extern "C" fn phlow_views_drop(phlow_views: OwnedPtr<Vec<Box<dyn PhlowView>>>) {
    drop(phlow_views);
}