simdjson_rust/ondemand/
object.rs1use std::{marker::PhantomData, ptr::NonNull};
2
3use simdjson_sys as ffi;
4
5use super::{document::Document, object_iterator::ObjectIterator, value::Value};
6use crate::{
7 error::Result,
8 macros::{impl_drop, map_result},
9 utils::string_view_to_str,
10};
11
12pub struct Object<'a> {
13 ptr: NonNull<ffi::SJ_OD_object>,
14 _doc: PhantomData<&'a mut Document<'a, 'a>>,
15}
16
17impl<'a> Object<'a> {
18 pub fn new(ptr: NonNull<ffi::SJ_OD_object>) -> Self {
19 Self {
20 ptr,
21 _doc: PhantomData,
22 }
23 }
24
25 pub fn at_pointer(&mut self, json_pointer: &str) -> Result<Value<'a>> {
26 map_result!(
27 ffi::SJ_OD_object_at_pointer(
28 self.ptr.as_mut(),
29 json_pointer.as_ptr().cast(),
30 json_pointer.len()
31 ),
32 ffi::SJ_OD_value_result_error,
33 ffi::SJ_OD_value_result_value_unsafe
34 )
35 .map(Value::new)
36 }
37
38 pub fn iter(&mut self) -> Result<ObjectIterator<'a>> {
39 let begin = map_result!(
40 ffi::SJ_OD_object_begin(self.ptr.as_mut()),
41 ffi::SJ_OD_object_iterator_result_error,
42 ffi::SJ_OD_object_iterator_result_value_unsafe
43 )?;
44 let end = map_result!(
45 ffi::SJ_OD_object_end(self.ptr.as_mut()),
46 ffi::SJ_OD_object_iterator_result_error,
47 ffi::SJ_OD_object_iterator_result_value_unsafe
48 )?;
49 Ok(ObjectIterator::new(begin, end))
50 }
51
52 pub fn raw_json(&mut self) -> Result<&'a str> {
53 let sv = map_result!(
54 ffi::SJ_OD_object_raw_json(self.ptr.as_mut()),
55 ffi::STD_string_view_result_error,
56 ffi::STD_string_view_result_value_unsafe
57 )?;
58 Ok(string_view_to_str(sv))
59 }
60
61 pub fn find_field(&mut self, key: &str) -> Result<Value<'a>> {
62 map_result!(
63 ffi::SJ_OD_object_find_field(self.ptr.as_mut(), key.as_ptr().cast(), key.len()),
64 ffi::SJ_OD_value_result_error,
65 ffi::SJ_OD_value_result_value_unsafe
66 )
67 .map(Value::new)
68 }
69
70 pub fn find_field_unordered(&mut self, key: &str) -> Result<Value<'a>> {
71 map_result!(
72 ffi::SJ_OD_object_find_field_unordered(
73 self.ptr.as_mut(),
74 key.as_ptr().cast(),
75 key.len()
76 ),
77 ffi::SJ_OD_value_result_error,
78 ffi::SJ_OD_value_result_value_unsafe
79 )
80 .map(Value::new)
81 }
82
83 pub fn count_fields(&mut self) -> Result<usize> {
84 map_result!(
85 primitive,
86 ffi::SJ_OD_object_count_fields(self.ptr.as_mut()),
87 ffi::size_t_result_error,
88 ffi::size_t_result_value_unsafe
89 )
90 }
91
92 pub fn is_empty(&mut self) -> Result<bool> {
93 map_result!(
94 primitive,
95 ffi::SJ_OD_object_is_empty(self.ptr.as_mut()),
96 ffi::bool_result_error,
97 ffi::bool_result_value_unsafe
98 )
99 }
100
101 pub fn reset(&mut self) -> Result<bool> {
102 map_result!(
103 primitive,
104 ffi::SJ_OD_object_reset(self.ptr.as_mut()),
105 ffi::bool_result_error,
106 ffi::bool_result_value_unsafe
107 )
108 }
109}
110
111impl_drop!(Object<'a>, ffi::SJ_OD_object_free);