Skip to main content

phlow_ffi/
phlow_view.rs

1use string_box::StringBox;
2use value_box::{BorrowedPtr, ErasedBorrowedPtr, OwnedPtr, ReturnBoxerResult};
3
4use phlow::{AnySendObject, ObjectRef, PhlowView, ViewInstance};
5
6#[unsafe(no_mangle)]
7pub extern "C" fn phlow_view_get_type(
8    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
9    mut view_type: BorrowedPtr<StringBox>,
10) {
11    phlow_view
12        .with_ref(|phlow_view| {
13            view_type.with_mut_ok(|view_type| {
14                view_type.set_string(phlow_view.get_view_type().to_string())
15            })
16        })
17        .log();
18}
19
20#[unsafe(no_mangle)]
21pub extern "C" fn phlow_view_get_title(
22    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
23    mut view_title: BorrowedPtr<StringBox>,
24) {
25    phlow_view
26        .with_ref(|phlow_view| {
27            view_title
28                .with_mut_ok(|view_title| view_title.set_string(phlow_view.get_title().to_string()))
29        })
30        .log();
31}
32
33#[unsafe(no_mangle)]
34pub extern "C" fn phlow_view_get_priority(phlow_view: BorrowedPtr<Box<dyn PhlowView>>) -> usize {
35    phlow_view
36        .with_ref_ok(|phlow_view| phlow_view.get_priority())
37        .or_log(0)
38}
39
40#[unsafe(no_mangle)]
41pub extern "C" fn phlow_view_get_source_code(
42    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
43    mut source_code: BorrowedPtr<StringBox>,
44) {
45    phlow_view
46        .with_ref(|phlow_view| {
47            source_code.with_mut_ok(|source_code| {
48                source_code.set_string(
49                    phlow_view
50                        .get_defining_method()
51                        .map(|method| method.name())
52                        .unwrap_or_default()
53                        .to_string(),
54                )
55            })
56        })
57        .log();
58}
59
60#[unsafe(no_mangle)]
61pub extern "C" fn phlow_view_create_instance_for_typed_object(
62    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
63    object: ErasedBorrowedPtr,
64) -> OwnedPtr<Box<dyn ViewInstance>> {
65    phlow_view
66        .with_ref(|phlow_view| {
67            object.with_ptr_ok(|ptr| unsafe {
68                OwnedPtr::new(ObjectRef::with_erased_ptr(ptr, |object| {
69                    phlow_view.create_instance(object)
70                }))
71            })
72        })
73        .or_log(OwnedPtr::null())
74}
75
76#[unsafe(no_mangle)]
77pub extern "C" fn phlow_view_create_instance_for_any_object(
78    phlow_view: BorrowedPtr<Box<dyn PhlowView>>,
79    object: BorrowedPtr<AnySendObject>,
80) -> OwnedPtr<Box<dyn ViewInstance>> {
81    phlow_view
82        .with_ref(|phlow_view| {
83            object.with_ref_ok(|ptr| {
84                OwnedPtr::new(ObjectRef::with_any(ptr.as_any(), |object| {
85                    phlow_view.create_instance(object)
86                }))
87            })
88        })
89        .or_log(OwnedPtr::null())
90}
91
92#[unsafe(no_mangle)]
93pub extern "C" fn phlow_view_drop(phlow_view: OwnedPtr<Box<dyn PhlowView>>) {
94    drop(phlow_view);
95}
96
97#[unsafe(no_mangle)]
98pub extern "C" fn phlow_any_send_object_drop(object: OwnedPtr<AnySendObject>) {
99    drop(object);
100}
101
102#[unsafe(no_mangle)]
103pub extern "C" fn phlow_views_pop(
104    mut phlow_views: BorrowedPtr<Vec<Box<dyn PhlowView>>>,
105) -> OwnedPtr<Box<dyn PhlowView>> {
106    phlow_views
107        .with_mut_ok(|phlow_views| phlow_views.pop())
108        .map(|view| view.map_or(OwnedPtr::null(), OwnedPtr::new))
109        .or_log(OwnedPtr::null())
110}
111
112#[unsafe(no_mangle)]
113pub extern "C" fn phlow_views_drop(phlow_views: OwnedPtr<Vec<Box<dyn PhlowView>>>) {
114    drop(phlow_views);
115}