facet_reflect/poke/
dynamic_value.rs1use core::mem::ManuallyDrop;
4
5use facet_core::{DynValueKind, DynamicValueDef, Facet, PtrMut, PtrUninit};
6
7use crate::{HeapValue, ReflectError, ReflectErrorKind};
8
9use super::Poke;
10
11pub struct PokeDynamicValue<'mem, 'facet> {
19 pub(crate) value: Poke<'mem, 'facet>,
20 pub(crate) def: DynamicValueDef,
21}
22
23impl<'mem, 'facet> core::fmt::Debug for PokeDynamicValue<'mem, 'facet> {
24 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
25 f.debug_struct("PokeDynamicValue")
26 .field("kind", &self.kind())
27 .finish_non_exhaustive()
28 }
29}
30
31impl<'mem, 'facet> PokeDynamicValue<'mem, 'facet> {
32 #[inline]
39 pub const unsafe fn new(value: Poke<'mem, 'facet>, def: DynamicValueDef) -> Self {
40 Self { value, def }
41 }
42
43 #[inline(always)]
45 pub const fn def(&self) -> DynamicValueDef {
46 self.def
47 }
48
49 #[inline]
51 pub fn as_peek(&self) -> crate::Peek<'_, 'facet> {
52 self.value.as_peek()
53 }
54
55 #[inline]
57 pub fn kind(&self) -> DynValueKind {
58 unsafe { (self.def.vtable.get_kind)(self.value.data()) }
59 }
60
61 #[inline]
63 pub fn is_null(&self) -> bool {
64 self.kind() == DynValueKind::Null
65 }
66
67 #[inline]
69 pub fn as_bool(&self) -> Option<bool> {
70 unsafe { (self.def.vtable.get_bool)(self.value.data()) }
71 }
72
73 #[inline]
75 pub fn as_i64(&self) -> Option<i64> {
76 unsafe { (self.def.vtable.get_i64)(self.value.data()) }
77 }
78
79 #[inline]
81 pub fn as_u64(&self) -> Option<u64> {
82 unsafe { (self.def.vtable.get_u64)(self.value.data()) }
83 }
84
85 #[inline]
87 pub fn as_f64(&self) -> Option<f64> {
88 unsafe { (self.def.vtable.get_f64)(self.value.data()) }
89 }
90
91 #[inline]
93 pub fn as_str(&self) -> Option<&str> {
94 unsafe { (self.def.vtable.get_str)(self.value.data()) }
95 }
96
97 #[inline]
99 pub fn as_bytes(&self) -> Option<&[u8]> {
100 self.def
101 .vtable
102 .get_bytes
103 .and_then(|f| unsafe { f(self.value.data()) })
104 }
105
106 #[inline]
108 pub fn array_len(&self) -> Option<usize> {
109 unsafe { (self.def.vtable.array_len)(self.value.data()) }
110 }
111
112 #[inline]
114 pub fn object_len(&self) -> Option<usize> {
115 unsafe { (self.def.vtable.object_len)(self.value.data()) }
116 }
117
118 #[inline]
120 unsafe fn drop_and_as_uninit(&mut self) -> PtrUninit {
121 unsafe { self.value.shape.call_drop_in_place(self.value.data_mut()) };
122 PtrUninit::new(self.value.data_mut().as_mut_byte_ptr())
123 }
124
125 pub fn set_null(&mut self) {
127 unsafe {
128 let uninit = self.drop_and_as_uninit();
129 (self.def.vtable.set_null)(uninit);
130 }
131 }
132
133 pub fn set_bool(&mut self, v: bool) {
135 unsafe {
136 let uninit = self.drop_and_as_uninit();
137 (self.def.vtable.set_bool)(uninit, v);
138 }
139 }
140
141 pub fn set_i64(&mut self, v: i64) {
143 unsafe {
144 let uninit = self.drop_and_as_uninit();
145 (self.def.vtable.set_i64)(uninit, v);
146 }
147 }
148
149 pub fn set_u64(&mut self, v: u64) {
151 unsafe {
152 let uninit = self.drop_and_as_uninit();
153 (self.def.vtable.set_u64)(uninit, v);
154 }
155 }
156
157 pub fn set_f64(&mut self, v: f64) -> bool {
161 unsafe {
162 let uninit = self.drop_and_as_uninit();
163 (self.def.vtable.set_f64)(uninit, v)
164 }
165 }
166
167 pub fn set_str(&mut self, v: &str) {
169 unsafe {
170 let uninit = self.drop_and_as_uninit();
171 (self.def.vtable.set_str)(uninit, v);
172 }
173 }
174
175 pub fn set_bytes(&mut self, v: &[u8]) -> bool {
179 let Some(set_bytes) = self.def.vtable.set_bytes else {
180 return false;
181 };
182 unsafe {
183 let uninit = self.drop_and_as_uninit();
184 set_bytes(uninit, v);
185 }
186 true
187 }
188
189 pub fn set_array(&mut self) {
191 unsafe {
192 let uninit = self.drop_and_as_uninit();
193 (self.def.vtable.begin_array)(uninit);
194 }
195 }
196
197 pub fn set_object(&mut self) {
199 unsafe {
200 let uninit = self.drop_and_as_uninit();
201 (self.def.vtable.begin_object)(uninit);
202 }
203 }
204
205 pub fn push_array_element<T: Facet<'facet>>(&mut self, element: T) -> Result<(), ReflectError> {
214 if self.value.shape != T::SHAPE {
215 return Err(self.value.err(ReflectErrorKind::WrongShape {
216 expected: self.value.shape,
217 actual: T::SHAPE,
218 }));
219 }
220 let mut element = ManuallyDrop::new(element);
221 unsafe {
222 let elem_ptr = PtrMut::new(&mut element as *mut ManuallyDrop<T> as *mut u8);
223 (self.def.vtable.push_array_element)(self.value.data_mut(), elem_ptr);
224 }
225 Ok(())
226 }
227
228 pub fn push_array_element_from_heap<const BORROW: bool>(
232 &mut self,
233 element: HeapValue<'facet, BORROW>,
234 ) -> Result<(), ReflectError> {
235 if self.value.shape != element.shape() {
236 return Err(self.value.err(ReflectErrorKind::WrongShape {
237 expected: self.value.shape,
238 actual: element.shape(),
239 }));
240 }
241 let mut element = element;
242 let guard = element
243 .guard
244 .take()
245 .expect("HeapValue guard was already taken");
246 unsafe {
247 let elem_ptr = PtrMut::new(guard.ptr.as_ptr());
248 (self.def.vtable.push_array_element)(self.value.data_mut(), elem_ptr);
249 }
250 drop(guard);
251 Ok(())
252 }
253
254 pub fn end_array(&mut self) {
256 if let Some(end_array) = self.def.vtable.end_array {
257 unsafe { end_array(self.value.data_mut()) };
258 }
259 }
260
261 pub fn insert_object_entry<T: Facet<'facet>>(
269 &mut self,
270 key: &str,
271 value: T,
272 ) -> Result<(), ReflectError> {
273 if self.value.shape != T::SHAPE {
274 return Err(self.value.err(ReflectErrorKind::WrongShape {
275 expected: self.value.shape,
276 actual: T::SHAPE,
277 }));
278 }
279 let mut value = ManuallyDrop::new(value);
280 unsafe {
281 let value_ptr = PtrMut::new(&mut value as *mut ManuallyDrop<T> as *mut u8);
282 (self.def.vtable.insert_object_entry)(self.value.data_mut(), key, value_ptr);
283 }
284 Ok(())
285 }
286
287 pub fn insert_object_entry_from_heap<const BORROW: bool>(
291 &mut self,
292 key: &str,
293 value: HeapValue<'facet, BORROW>,
294 ) -> Result<(), ReflectError> {
295 if self.value.shape != value.shape() {
296 return Err(self.value.err(ReflectErrorKind::WrongShape {
297 expected: self.value.shape,
298 actual: value.shape(),
299 }));
300 }
301 let mut value = value;
302 let guard = value
303 .guard
304 .take()
305 .expect("HeapValue guard was already taken");
306 unsafe {
307 let value_ptr = PtrMut::new(guard.ptr.as_ptr());
308 (self.def.vtable.insert_object_entry)(self.value.data_mut(), key, value_ptr);
309 }
310 drop(guard);
311 Ok(())
312 }
313
314 pub fn end_object(&mut self) {
316 if let Some(end_object) = self.def.vtable.end_object {
317 unsafe { end_object(self.value.data_mut()) };
318 }
319 }
320
321 #[inline]
326 pub fn object_get_mut(&mut self, key: &str) -> Option<Poke<'_, 'facet>> {
327 let object_get_mut = self.def.vtable.object_get_mut?;
328 let inner_ptr = unsafe { object_get_mut(self.value.data_mut(), key)? };
329 Some(unsafe { Poke::from_raw_parts(inner_ptr, self.value.shape) })
331 }
332
333 #[inline]
335 pub const fn into_inner(self) -> Poke<'mem, 'facet> {
336 self.value
337 }
338
339 #[inline]
341 pub fn as_peek_dynamic_value(&self) -> crate::PeekDynamicValue<'_, 'facet> {
342 crate::PeekDynamicValue {
343 value: self.value.as_peek(),
344 def: self.def,
345 }
346 }
347}