Skip to main content

substreams/
state.rs

1use crate::scalar::{BigDecimal, BigInt};
2#[cfg(target_arch = "wasm32")]
3use crate::{externs, memory};
4
5#[cfg(target_arch = "wasm32")]
6pub fn foundational_store_get(store_index: u32, req_ptr: u32, req_len: u32) -> u64 {
7    unsafe { externs::state::foundational_store_get_entries(store_index, req_ptr, req_len) }
8}
9
10#[cfg(target_arch = "wasm32")]
11pub fn foundational_store_get_first(store_index: u32, req_ptr: u32, req_len: u32) -> u64 {
12    unsafe { externs::state::foundational_store_get_first_entries(store_index, req_ptr, req_len) }
13}
14
15// noop
16#[cfg(not(target_arch = "wasm32"))]
17pub fn foundational_store_get(_: u32, _: u32, _: u32) -> u64 {
18    0
19}
20#[cfg(not(target_arch = "wasm32"))]
21pub fn foundational_store_get_first(_: u32, _: u32, _: u32) -> u64 {
22    0
23}
24
25#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
26pub fn get_at<K: AsRef<str>>(store_idx: u32, ord: i64, key: K) -> Option<Vec<u8>> {
27    #[cfg(target_arch = "wasm32")]
28    {
29        let key = key.as_ref();
30
31        unsafe {
32            let key_bytes = key.as_bytes();
33            let output_ptr = memory::alloc(8);
34            let found = externs::state::get_at(
35                store_idx,
36                ord,
37                key_bytes.as_ptr(),
38                key_bytes.len() as u32,
39                output_ptr as u32,
40            );
41            return if found == 1 {
42                Some(memory::get_output_data(output_ptr))
43            } else {
44                None
45            };
46        }
47    }
48
49    #[cfg(not(target_arch = "wasm32"))]
50    None
51}
52
53#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
54pub fn has_at<K: AsRef<str>>(store_idx: u32, ord: i64, key: K) -> bool {
55    #[cfg(target_arch = "wasm32")]
56    {
57        let key = key.as_ref();
58
59        unsafe {
60            let key_bytes = key.as_bytes();
61            let found =
62                externs::state::has_at(store_idx, ord, key_bytes.as_ptr(), key_bytes.len() as u32);
63            return found == 1;
64        }
65    }
66
67    #[cfg(not(target_arch = "wasm32"))]
68    false
69}
70
71#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
72pub fn get_last<K: AsRef<str>>(store_idx: u32, key: K) -> Option<Vec<u8>> {
73    #[cfg(target_arch = "wasm32")]
74    {
75        let key = key.as_ref();
76
77        unsafe {
78            let key_bytes = key.as_bytes();
79            let output_ptr = memory::alloc(8);
80            let found = externs::state::get_last(
81                store_idx,
82                key_bytes.as_ptr(),
83                key_bytes.len() as u32,
84                output_ptr as u32,
85            );
86
87            return if found == 1 {
88                Some(memory::get_output_data(output_ptr))
89            } else {
90                None
91            };
92        }
93    }
94
95    #[cfg(not(target_arch = "wasm32"))]
96    None
97}
98
99#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
100pub fn has_last<K: AsRef<str>>(store_idx: u32, key: K) -> bool {
101    #[cfg(target_arch = "wasm32")]
102    {
103        let key = key.as_ref();
104
105        unsafe {
106            let key_bytes = key.as_bytes();
107            let found =
108                externs::state::has_last(store_idx, key_bytes.as_ptr(), key_bytes.len() as u32);
109            return found == 1;
110        }
111    }
112
113    #[cfg(not(target_arch = "wasm32"))]
114    false
115}
116
117#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
118pub fn get_first<K: AsRef<str>>(store_idx: u32, key: K) -> Option<Vec<u8>> {
119    #[cfg(target_arch = "wasm32")]
120    {
121        let key = key.as_ref();
122
123        unsafe {
124            let key_bytes = key.as_bytes();
125            let output_ptr = memory::alloc(8);
126
127            let found = externs::state::get_first(
128                store_idx,
129                key_bytes.as_ptr(),
130                key_bytes.len() as u32,
131                output_ptr as u32,
132            );
133
134            return if found == 1 {
135                Some(memory::get_output_data(output_ptr))
136            } else {
137                None
138            };
139        }
140    }
141
142    #[cfg(not(target_arch = "wasm32"))]
143    None
144}
145
146#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
147pub fn has_first<K: AsRef<str>>(store_idx: u32, key: K) -> bool {
148    #[cfg(target_arch = "wasm32")]
149    {
150        let key = key.as_ref();
151
152        unsafe {
153            let key_bytes = key.as_bytes();
154            let found =
155                externs::state::has_first(store_idx, key_bytes.as_ptr(), key_bytes.len() as u32);
156            return found == 1;
157        }
158    }
159
160    #[cfg(not(target_arch = "wasm32"))]
161    false
162}
163
164#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
165pub fn set<K, V>(ord: i64, key: K, value: V)
166where
167    K: AsRef<str>,
168    V: AsRef<[u8]>,
169{
170    #[cfg(target_arch = "wasm32")]
171    {
172        let key = key.as_ref();
173        let value = value.as_ref();
174
175        unsafe {
176            externs::state::set(
177                ord,
178                key.as_ptr(),
179                key.len() as u32,
180                value.as_ptr(),
181                value.len() as u32,
182            )
183        }
184    }
185}
186
187#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
188pub fn set_if_not_exists<K, V>(ord: i64, key: K, value: V)
189where
190    K: AsRef<str>,
191    V: AsRef<[u8]>,
192{
193    #[cfg(target_arch = "wasm32")]
194    {
195        let key = key.as_ref();
196        let value = value.as_ref();
197
198        unsafe {
199            externs::state::set_if_not_exists(
200                ord,
201                key.as_ptr(),
202                key.len() as u32,
203                value.as_ptr(),
204                value.len() as u32,
205            )
206        }
207    }
208}
209
210#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
211pub fn append<K, V>(ord: i64, key: K, value: V)
212where
213    K: AsRef<str>,
214    V: AsRef<[u8]>,
215{
216    #[cfg(target_arch = "wasm32")]
217    {
218        let key = key.as_ref();
219        let value = value.as_ref();
220
221        unsafe {
222            externs::state::append(
223                ord,
224                key.as_ptr(),
225                key.len() as u32,
226                value.as_ptr(),
227                value.len() as u32,
228            )
229        }
230    }
231}
232
233#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
234pub fn delete_prefix<K: AsRef<str>>(ord: i64, prefix: K) {
235    #[cfg(target_arch = "wasm32")]
236    {
237        let prefix = prefix.as_ref();
238
239        unsafe { externs::state::delete_prefix(ord, prefix.as_ptr(), prefix.len() as u32) }
240    }
241}
242
243#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
244pub fn add_bigint<K, V>(ord: i64, key: K, value: V)
245where
246    K: AsRef<str>,
247    V: AsRef<BigInt>,
248{
249    #[cfg(target_arch = "wasm32")]
250    {
251        let key = key.as_ref();
252        let big_int = value.as_ref();
253        let data: String = big_int.into();
254
255        unsafe {
256            externs::state::add_bigint(
257                ord,
258                key.as_ptr(),
259                key.len() as u32,
260                data.as_ptr(),
261                data.len() as u32,
262            )
263        }
264    }
265}
266
267#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
268pub fn add_int64<K: AsRef<str>>(ord: i64, key: K, value: i64) {
269    #[cfg(target_arch = "wasm32")]
270    {
271        let key = key.as_ref();
272
273        unsafe { externs::state::add_int64(ord, key.as_ptr(), key.len() as u32, value) }
274    }
275}
276
277#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
278pub fn add_float64<K: AsRef<str>>(ord: i64, key: K, value: f64) {
279    #[cfg(target_arch = "wasm32")]
280    {
281        let key = key.as_ref();
282
283        unsafe { externs::state::add_float64(ord, key.as_ptr(), key.len() as u32, value) }
284    }
285}
286
287#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
288pub fn add_bigdecimal<K, V>(ord: i64, key: K, value: V)
289where
290    K: AsRef<str>,
291    V: AsRef<BigDecimal>,
292{
293    #[cfg(target_arch = "wasm32")]
294    {
295        let key = key.as_ref();
296        let big_decimal = value.as_ref();
297        let data: String = big_decimal.into();
298
299        unsafe {
300            externs::state::add_bigdecimal(
301                ord,
302                key.as_ptr(),
303                key.len() as u32,
304                data.as_ptr(),
305                data.len() as u32,
306            )
307        }
308    }
309}
310
311#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
312pub fn set_min_int64<K: AsRef<str>>(ord: i64, key: K, value: i64) {
313    #[cfg(target_arch = "wasm32")]
314    {
315        let key = key.as_ref();
316
317        unsafe { externs::state::set_min_int64(ord, key.as_ptr(), key.len() as u32, value) }
318    }
319}
320
321#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
322pub fn set_min_bigint<K, V>(ord: i64, key: K, value: V)
323where
324    K: AsRef<str>,
325    V: AsRef<BigInt>,
326{
327    #[cfg(target_arch = "wasm32")]
328    {
329        let key = key.as_ref();
330        let big_int = value.as_ref();
331        let data: String = big_int.into();
332
333        unsafe {
334            externs::state::set_min_bigint(
335                ord,
336                key.as_ptr(),
337                key.len() as u32,
338                data.as_ptr(),
339                data.len() as u32,
340            )
341        }
342    }
343}
344
345#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
346pub fn set_min_float64<K: AsRef<str>>(ord: i64, key: K, value: f64) {
347    #[cfg(target_arch = "wasm32")]
348    {
349        let key = key.as_ref();
350
351        unsafe { externs::state::set_min_float64(ord, key.as_ptr(), key.len() as u32, value) }
352    }
353}
354
355#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
356pub fn set_min_bigdecimal<K, V>(ord: i64, key: K, value: V)
357where
358    K: AsRef<str>,
359    V: AsRef<BigDecimal>,
360{
361    #[cfg(target_arch = "wasm32")]
362    {
363        let key = key.as_ref();
364        let big_decimal = value.as_ref();
365        let data: String = big_decimal.into();
366
367        unsafe {
368            externs::state::set_min_bigdecimal(
369                ord,
370                key.as_ptr(),
371                key.len() as u32,
372                data.as_ptr(),
373                data.len() as u32,
374            )
375        }
376    }
377}
378
379#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
380pub fn set_max_int64<K: AsRef<str>>(ord: i64, key: K, value: i64) {
381    #[cfg(target_arch = "wasm32")]
382    {
383        let key = key.as_ref();
384
385        unsafe { externs::state::set_max_int64(ord, key.as_ptr(), key.len() as u32, value) }
386    }
387}
388
389#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
390pub fn set_max_bigint<K, V>(ord: i64, key: K, value: V)
391where
392    K: AsRef<str>,
393    V: AsRef<BigInt>,
394{
395    #[cfg(target_arch = "wasm32")]
396    {
397        let key = key.as_ref();
398        let big_int = value.as_ref();
399        let data: String = big_int.into();
400
401        unsafe {
402            externs::state::set_max_bigint(
403                ord,
404                key.as_ptr(),
405                key.len() as u32,
406                data.as_ptr(),
407                data.len() as u32,
408            )
409        }
410    }
411}
412
413#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
414pub fn set_max_float64<K: AsRef<str>>(ord: i64, key: K, value: f64) {
415    #[cfg(target_arch = "wasm32")]
416    {
417        let key = key.as_ref();
418
419        unsafe { externs::state::set_max_float64(ord, key.as_ptr(), key.len() as u32, value) }
420    }
421}
422
423#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
424pub fn set_max_bigdecimal<K, V>(ord: i64, key: K, value: V)
425where
426    K: AsRef<str>,
427    V: AsRef<BigDecimal>,
428{
429    #[cfg(target_arch = "wasm32")]
430    {
431        let key = key.as_ref();
432        let big_decimal = value.as_ref();
433        let data: String = big_decimal.into();
434
435        unsafe {
436            externs::state::set_max_bigdecimal(
437                ord,
438                key.as_ptr(),
439                key.len() as u32,
440                data.as_ptr(),
441                data.len() as u32,
442            )
443        }
444    }
445}
446
447#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
448pub fn set_sum_bigint<K, V>(ord: i64, key: K, value: V)
449where
450    K: AsRef<str>,
451    V: AsRef<str>,
452    String: From<V>,
453{
454    #[cfg(target_arch = "wasm32")]
455    {
456        let key = key.as_ref();
457        let data: String = value.into();
458
459        unsafe {
460            externs::state::set_sum_bigint(
461                ord,
462                key.as_ptr(),
463                key.len() as u32,
464                data.as_ptr(),
465                data.len() as u32,
466            )
467        }
468    }
469}
470
471#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
472pub fn set_sum_bigdecimal<K, V>(ord: i64, key: K, value: V)
473where
474    K: AsRef<str>,
475    V: AsRef<str>,
476    String: From<V>,
477{
478    #[cfg(target_arch = "wasm32")]
479    {
480        let key = key.as_ref();
481        let data: String = value.into();
482
483        unsafe {
484            externs::state::set_sum_bigdecimal(
485                ord,
486                key.as_ptr(),
487                key.len() as u32,
488                data.as_ptr(),
489                data.len() as u32,
490            )
491        }
492    }
493}
494
495#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
496pub fn set_sum_int64<K, V>(ord: i64, key: K, value: V)
497where
498    K: AsRef<str>,
499    V: AsRef<str>,
500    String: From<V>,
501{
502    #[cfg(target_arch = "wasm32")]
503    {
504        let key = key.as_ref();
505        let data: String = value.into();
506
507        unsafe {
508            externs::state::set_sum_int64(
509                ord,
510                key.as_ptr(),
511                key.len() as u32,
512                data.as_ptr(),
513                data.len() as u32,
514            )
515        }
516    }
517}
518
519#[cfg_attr(not(target_arch = "wasm32"), allow(unused_variables))]
520pub fn set_sum_float64<K, V>(ord: i64, key: K, value: V)
521where
522    K: AsRef<str>,
523    V: AsRef<str>,
524    String: From<V>,
525{
526    #[cfg(target_arch = "wasm32")]
527    {
528        let key = key.as_ref();
529        let data: String = value.into();
530
531        unsafe {
532            externs::state::set_sum_float64(
533                ord,
534                key.as_ptr(),
535                key.len() as u32,
536                data.as_ptr(),
537                data.len() as u32,
538            )
539        }
540    }
541}