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}