1#[cxx::bridge]
2mod ffi {
3 #[namespace = "google::protobuf"]
4 unsafe extern "C++" {
5 include!(<google/protobuf/arena.h>);
6 type Arena;
7 #[rust_name = "space_allocated"]
8 fn SpaceAllocated(self: &Arena) -> u64;
9 #[rust_name = "space_used"]
10 fn SpaceUsed(self: &Arena) -> u64;
11
12 include!(<google/protobuf/descriptor.h>);
13 type DescriptorPool;
14
15 include!(<google/protobuf/message.h>);
16 type MessageFactory;
17 }
18
19 #[namespace = "rust::cel_cxx"]
20 unsafe extern "C++" {
21 include!(<cel-cxx-ffi/include/protobuf.h>);
22 fn NewArena() -> SharedPtr<Arena>;
23
24 fn generated_pool() -> SharedPtr<DescriptorPool>;
25 fn NewDescriptorPool(file_descriptor_set: &[u8]) -> SharedPtr<DescriptorPool>;
26
27 fn generated_factory() -> SharedPtr<MessageFactory>;
28 fn NewMessageFactory() -> SharedPtr<MessageFactory>;
29 }
30}
31
32pub use ffi::Arena;
34unsafe impl Send for Arena {}
35unsafe impl Sync for Arena {}
36impl Arena {
37 pub fn new() -> cxx::SharedPtr<Self> {
38 ffi::NewArena()
39 }
40}
41
42impl std::fmt::Debug for Arena {
43 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44 write!(
45 f,
46 "Arena {{ space_allocated: {}, space_used: {} }}",
47 self.space_allocated(),
48 self.space_used(),
49 )
50 }
51}
52
53pub use ffi::DescriptorPool;
55unsafe impl Send for DescriptorPool {}
56unsafe impl Sync for DescriptorPool {}
57
58impl DescriptorPool {
59 pub fn generated() -> cxx::SharedPtr<Self> {
60 ffi::generated_pool()
61 }
62
63 pub fn new(file_descriptor_set: &[u8]) -> cxx::SharedPtr<Self> {
64 ffi::NewDescriptorPool(file_descriptor_set)
65 }
66}
67
68impl std::fmt::Debug for DescriptorPool {
69 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70 let ptr = self as *const DescriptorPool;
71 let is_generated = {
72 let generated_ptr = Self::generated()
73 .as_ref()
74 .expect("generated_pool is not initialized")
75 as *const ffi::DescriptorPool;
76 ptr == generated_ptr
77 };
78 write!(
79 f,
80 "DescriptorPool {{ ptr: {ptr:p}, is_generated: {is_generated} }}",
81 )
82 }
83}
84
85pub use ffi::MessageFactory;
87unsafe impl Send for MessageFactory {}
88unsafe impl Sync for MessageFactory {}
89
90impl MessageFactory {
91 pub fn generated() -> cxx::SharedPtr<Self> {
92 ffi::generated_factory()
93 }
94
95 pub fn new() -> cxx::SharedPtr<Self> {
96 ffi::NewMessageFactory()
97 }
98}
99
100impl std::fmt::Debug for MessageFactory {
101 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
102 let ptr = self as *const MessageFactory;
103 let is_generated = {
104 let generated_ptr = Self::generated()
105 .as_ref()
106 .expect("generated_factory is not initialized")
107 as *const ffi::MessageFactory;
108 ptr == generated_ptr
109 };
110 write!(
111 f,
112 "MessageFactory {{ ptr: {ptr:p}, is_generated: {is_generated} }}",
113 )
114 }
115}