Skip to main content

radixdb_plugin_abi/
descriptor.rs

1use crate::{
2    RadixAbiBatchViewV1, RadixAbiCallContextV1, RadixAbiHashSinkV1, RadixAbiHeaderV1,
3    RadixAbiResultBuilderV1, RadixAbiSliceV1, RadixAbiStatusV1, RadixAbiStringV1,
4    RadixAbiTypeRefV1, RadixAbiValueV1,
5};
6
7pub type RadixAbiCodecFnV1 = unsafe extern "C" fn(
8    context: *const RadixAbiCallContextV1,
9    input: *const RadixAbiValueV1,
10    output: *const RadixAbiResultBuilderV1,
11) -> RadixAbiStatusV1;
12pub type RadixAbiParseFnV1 = unsafe extern "C" fn(
13    context: *const RadixAbiCallContextV1,
14    input: RadixAbiSliceV1,
15    output: *const RadixAbiResultBuilderV1,
16) -> RadixAbiStatusV1;
17pub type RadixAbiEqualFnV1 = unsafe extern "C" fn(
18    context: *const RadixAbiCallContextV1,
19    left: *const RadixAbiValueV1,
20    right: *const RadixAbiValueV1,
21    output: *mut u8,
22) -> RadixAbiStatusV1;
23pub type RadixAbiCompareFnV1 = unsafe extern "C" fn(
24    context: *const RadixAbiCallContextV1,
25    left: *const RadixAbiValueV1,
26    right: *const RadixAbiValueV1,
27    output: *mut i8,
28) -> RadixAbiStatusV1;
29pub type RadixAbiHashFnV1 = unsafe extern "C" fn(
30    context: *const RadixAbiCallContextV1,
31    value: *const RadixAbiValueV1,
32    sink: *const RadixAbiHashSinkV1,
33) -> RadixAbiStatusV1;
34pub type RadixAbiScalarFnV1 = unsafe extern "C" fn(
35    context: *const RadixAbiCallContextV1,
36    arguments: *const RadixAbiValueV1,
37    argument_count: u32,
38    output: *const RadixAbiResultBuilderV1,
39) -> RadixAbiStatusV1;
40pub type RadixAbiBatchFnV1 = unsafe extern "C" fn(
41    context: *const RadixAbiCallContextV1,
42    input: *const RadixAbiBatchViewV1,
43    output: *const RadixAbiResultBuilderV1,
44) -> RadixAbiStatusV1;
45pub type RadixAbiPlannerSupportFnV1 = unsafe extern "C" fn(
46    context: *const RadixAbiCallContextV1,
47    normalized_predicate: RadixAbiSliceV1,
48    output: *const RadixAbiResultBuilderV1,
49) -> RadixAbiStatusV1;
50
51#[repr(C)]
52#[derive(Clone, Copy)]
53pub struct RadixAbiExternalTypeDescriptorV1 {
54    pub header: RadixAbiHeaderV1,
55    pub object_id: [u8; 16],
56    pub local_id: RadixAbiStringV1,
57    pub display_name: RadixAbiStringV1,
58    pub codec_version: u32,
59    pub semantic_revision: u32,
60    pub storage_kind: u16,
61    pub reserved_u16: u16,
62    pub fixed_bytes: u32,
63    pub max_bytes: u32,
64    pub reserved_u32: u32,
65    pub capabilities: u64,
66    pub codec_fingerprint: [u8; 32],
67    pub encode: Option<RadixAbiCodecFnV1>,
68    pub decode: Option<RadixAbiParseFnV1>,
69    pub equality: Option<RadixAbiEqualFnV1>,
70    pub hash: Option<RadixAbiHashFnV1>,
71    pub ordering: Option<RadixAbiCompareFnV1>,
72    pub text_input: Option<RadixAbiParseFnV1>,
73    pub text_output: Option<RadixAbiCodecFnV1>,
74    pub binary_input: Option<RadixAbiParseFnV1>,
75    pub binary_output: Option<RadixAbiCodecFnV1>,
76}
77
78#[repr(C)]
79#[derive(Clone, Copy)]
80pub struct RadixAbiScalarFunctionDescriptorV1 {
81    pub header: RadixAbiHeaderV1,
82    pub object_id: [u8; 16],
83    pub local_id: RadixAbiStringV1,
84    pub display_name: RadixAbiStringV1,
85    pub semantic_revision: u32,
86    pub argument_count: u32,
87    pub arguments: *const RadixAbiTypeRefV1,
88    pub result: RadixAbiTypeRefV1,
89    pub volatility: u16,
90    pub cancellation: u16,
91    pub strict: u8,
92    pub parallel_safe: u8,
93    pub reserved_u16: u16,
94    pub cost: u32,
95    pub max_output_bytes: u32,
96    pub scalar: Option<RadixAbiScalarFnV1>,
97    pub batch: Option<RadixAbiBatchFnV1>,
98}
99
100#[repr(C)]
101#[derive(Clone, Copy)]
102pub struct RadixAbiOperatorDescriptorV1 {
103    pub header: RadixAbiHeaderV1,
104    pub object_id: [u8; 16],
105    pub local_id: RadixAbiStringV1,
106    pub symbol: RadixAbiStringV1,
107    pub semantic_revision: u32,
108    pub reserved: u32,
109    pub left: RadixAbiTypeRefV1,
110    pub right: RadixAbiTypeRefV1,
111    pub result: RadixAbiTypeRefV1,
112    pub function_id: [u8; 16],
113}
114
115#[repr(C)]
116#[derive(Debug, Clone, Copy)]
117pub struct RadixAbiBindingEntryV1 {
118    pub slot: u16,
119    pub flags: u16,
120    pub object_id: [u8; 16],
121}
122
123pub type RadixAbiKeyEncodeFnV1 = unsafe extern "C" fn(
124    context: *const RadixAbiCallContextV1,
125    value: *const RadixAbiValueV1,
126    output: *const RadixAbiResultBuilderV1,
127) -> RadixAbiStatusV1;
128
129#[repr(C)]
130#[derive(Clone, Copy)]
131pub struct RadixAbiOperatorClassDescriptorV1 {
132    pub header: RadixAbiHeaderV1,
133    pub object_id: [u8; 16],
134    pub local_id: RadixAbiStringV1,
135    pub semantic_revision: u32,
136    pub access_method: u16,
137    pub reserved_u16: u16,
138    pub input_type: RadixAbiTypeRefV1,
139    pub key_type: RadixAbiTypeRefV1,
140    pub key_codec_revision: u32,
141    pub strategy_count: u32,
142    pub strategies: *const RadixAbiBindingEntryV1,
143    pub support_count: u32,
144    pub reserved_u32: u32,
145    pub supports: *const RadixAbiBindingEntryV1,
146    pub fingerprint: [u8; 32],
147    pub encode_key: Option<RadixAbiKeyEncodeFnV1>,
148}
149
150#[repr(C)]
151#[derive(Clone, Copy)]
152pub struct RadixAbiPlannerSupportDescriptorV1 {
153    pub header: RadixAbiHeaderV1,
154    pub object_id: [u8; 16],
155    pub local_id: RadixAbiStringV1,
156    pub semantic_revision: u32,
157    pub max_spans: u32,
158    pub max_output_bytes: u32,
159    pub recheck_policy: u16,
160    pub reserved_u16: u16,
161    pub target_function_id: [u8; 16],
162    pub target_operator_class_id: [u8; 16],
163    pub fingerprint: [u8; 32],
164    pub callback: Option<RadixAbiPlannerSupportFnV1>,
165}
166
167#[repr(C)]
168#[derive(Clone, Copy)]
169pub struct RadixPluginDescriptorV1 {
170    pub header: RadixAbiHeaderV1,
171    pub package_id: [u8; 16],
172    pub package_name: RadixAbiStringV1,
173    pub package_version: RadixAbiStringV1,
174    pub abi_min_minor: u16,
175    pub abi_max_minor: u16,
176    pub reserved: u32,
177    pub descriptor_fingerprint: [u8; 32],
178    pub type_count: u32,
179    pub reserved_types: u32,
180    pub types: *const RadixAbiExternalTypeDescriptorV1,
181    pub function_count: u32,
182    pub reserved_functions: u32,
183    pub functions: *const RadixAbiScalarFunctionDescriptorV1,
184    pub operator_count: u32,
185    pub reserved_operators: u32,
186    pub operators: *const RadixAbiOperatorDescriptorV1,
187    pub operator_class_count: u32,
188    pub reserved_operator_classes: u32,
189    pub operator_classes: *const RadixAbiOperatorClassDescriptorV1,
190    pub planner_support_count: u32,
191    pub reserved_planner_support: u32,
192    pub planner_support: *const RadixAbiPlannerSupportDescriptorV1,
193}
194
195// SAFETY: these descriptor types are Sync only under the ABI contract that all
196// pointed-to names and tables are immutable and have process lifetime. The
197// generated SDK owns that proof; the PLUG-20 host validates the graph before
198// publishing it. Call-scoped value/batch/context structs deliberately do not
199// receive this implementation.
200unsafe impl Sync for RadixAbiExternalTypeDescriptorV1 {}
201// SAFETY: same immutable process-lifetime descriptor contract as above.
202unsafe impl Sync for RadixAbiScalarFunctionDescriptorV1 {}
203// SAFETY: same immutable process-lifetime descriptor contract as above.
204unsafe impl Sync for RadixAbiOperatorDescriptorV1 {}
205// SAFETY: same immutable process-lifetime descriptor contract as above.
206unsafe impl Sync for RadixAbiOperatorClassDescriptorV1 {}
207// SAFETY: same immutable process-lifetime descriptor contract as above.
208unsafe impl Sync for RadixAbiPlannerSupportDescriptorV1 {}
209// SAFETY: the package root and every reachable descriptor table are immutable
210// and live until process exit.
211unsafe impl Sync for RadixPluginDescriptorV1 {}