simdjson_rust/ondemand/
array.rs1use std::{marker::PhantomData, ptr::NonNull};
2
3use simdjson_sys as ffi;
4
5use super::{array_iterator::ArrayIterator, document::Document, value::Value};
6use crate::{
7 error::Result,
8 macros::{impl_drop, map_result},
9 utils::string_view_to_str,
10};
11
12pub struct Array<'a> {
13 ptr: NonNull<ffi::SJ_OD_array>,
14 _doc: PhantomData<&'a mut Document<'a, 'a>>,
15}
16
17impl<'a> Array<'a> {
18 pub fn new(ptr: NonNull<ffi::SJ_OD_array>) -> Self {
19 Self {
20 ptr,
21 _doc: PhantomData,
22 }
23 }
24
25 pub fn count_elements(&mut self) -> Result<usize> {
26 map_result!(
27 primitive,
28 ffi::SJ_OD_array_count_elements(self.ptr.as_mut()),
29 ffi::size_t_result_error,
30 ffi::size_t_result_value_unsafe
31 )
32 }
33
34 pub fn is_empty(&mut self) -> Result<bool> {
35 map_result!(
36 primitive,
37 ffi::SJ_OD_array_is_empty(self.ptr.as_mut()),
38 ffi::bool_result_error,
39 ffi::bool_result_value_unsafe
40 )
41 }
42
43 pub fn at(&mut self, index: usize) -> Result<Value<'a>> {
44 map_result!(
45 ffi::SJ_OD_array_at(self.ptr.as_mut(), index),
46 ffi::SJ_OD_value_result_error,
47 ffi::SJ_OD_value_result_value_unsafe
48 )
49 .map(Value::new)
50 }
51
52 pub fn at_pointer(&mut self, key: &str) -> Result<Value<'a>> {
53 map_result!(
54 ffi::SJ_OD_array_at_pointer(self.ptr.as_mut(), key.as_ptr().cast(), key.len()),
55 ffi::SJ_OD_value_result_error,
56 ffi::SJ_OD_value_result_value_unsafe
57 )
58 .map(Value::new)
59 }
60
61 pub fn reset(&mut self) -> Result<bool> {
62 map_result!(
63 primitive,
64 ffi::SJ_OD_array_reset(self.ptr.as_mut()),
65 ffi::bool_result_error,
66 ffi::bool_result_value_unsafe
67 )
68 }
69
70 pub fn iter(&mut self) -> Result<ArrayIterator> {
71 let begin = map_result!(
72 ffi::SJ_OD_array_begin(self.ptr.as_mut()),
73 ffi::SJ_OD_array_iterator_result_error,
74 ffi::SJ_OD_array_iterator_result_value_unsafe
75 )?;
76 let end = map_result!(
77 ffi::SJ_OD_array_end(self.ptr.as_mut()),
78 ffi::SJ_OD_array_iterator_result_error,
79 ffi::SJ_OD_array_iterator_result_value_unsafe
80 )?;
81 Ok(ArrayIterator::new(begin, end))
82 }
83
84 pub fn raw_json(&mut self) -> Result<&'a str> {
85 let sv = map_result!(
86 ffi::SJ_OD_array_raw_json(self.ptr.as_mut()),
87 ffi::STD_string_view_result_error,
88 ffi::STD_string_view_result_value_unsafe
89 )?;
90 Ok(string_view_to_str(sv))
91 }
92}
93
94impl_drop!(Array<'a>, ffi::SJ_OD_array_free);