cel_cxx_ffi/
protobuf.rs

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
32// Arena
33pub 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
53// DescriptorPool
54pub 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
85// MessageFactory
86pub 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}