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);
}