1use std::{borrow::Borrow, hash::Hash};
2
3use crate::{
4 AccessError, ExtendedValueType, TryTypeError, ValueType,
5 array::{self, ArrayMut, Indexed, IndexedMut},
6 base::{TypedValue, ValueAsScalar, ValueIntoString, ValueTryAsArrayMut, ValueTryAsMutObject},
7 derived::{
8 MutableArray, MutableObject, MutableValueArrayAccess, TypedArrayValue, TypedObjectValue,
9 TypedScalarValue, ValueArrayAccess, ValueArrayTryAccess, ValueObjectAccess,
10 ValueObjectAccessAsArray, ValueObjectAccessAsObject, ValueObjectAccessAsScalar,
11 ValueObjectAccessTryAsArray, ValueObjectAccessTryAsObject, ValueObjectAccessTryAsScalar,
12 ValueObjectTryAccess, ValueTryAsArray, ValueTryAsObject, ValueTryAsScalar,
13 ValueTryIntoArray, ValueTryIntoObject, ValueTryIntoString,
14 },
15 object::{Object, ObjectMut},
16 prelude::{
17 ValueAsArray, ValueAsMutArray, ValueAsMutObject, ValueAsObject, ValueIntoArray,
18 ValueIntoObject,
19 },
20};
21
22impl<T> ValueTryIntoString for T
23where
24 T: ValueIntoString + TypedValue,
25{
26 type String = T::String;
27
28 #[inline]
29 fn try_into_string(self) -> Result<Self::String, TryTypeError> {
30 let vt = self.value_type();
31 self.into_string().ok_or(TryTypeError {
32 expected: ValueType::String,
33 got: vt,
34 })
35 }
36}
37
38impl<T> ValueTryIntoArray for T
39where
40 T: ValueIntoArray + TypedValue,
41{
42 type Array = T::Array;
43 #[inline]
47 fn try_into_array(self) -> Result<Self::Array, TryTypeError> {
48 let vt = self.value_type();
49 self.into_array().ok_or(TryTypeError {
50 expected: ValueType::Array,
51 got: vt,
52 })
53 }
54}
55impl<T> ValueTryIntoObject for T
56where
57 T: ValueIntoObject + TypedValue,
58{
59 type Object = T::Object;
60
61 #[inline]
65 fn try_into_object(self) -> Result<Self::Object, TryTypeError> {
66 let vt = self.value_type();
67 self.into_object().ok_or(TryTypeError {
68 expected: ValueType::Object,
69 got: vt,
70 })
71 }
72}
73
74impl<T> ValueTryAsScalar for T
75where
76 T: ValueAsScalar + TypedValue,
77{
78 #[inline]
79 fn try_as_bool(&self) -> Result<bool, TryTypeError> {
80 self.as_bool().ok_or(TryTypeError {
81 expected: ValueType::Bool,
82 got: self.value_type(),
83 })
84 }
85
86 #[inline]
87 fn try_as_i128(&self) -> Result<i128, TryTypeError> {
88 self.as_i128().ok_or(TryTypeError {
89 expected: ValueType::I128,
90 got: self.value_type(),
91 })
92 }
93
94 #[inline]
95 fn try_as_i64(&self) -> Result<i64, TryTypeError> {
96 self.as_i64().ok_or(TryTypeError {
97 expected: ValueType::I64,
98 got: self.value_type(),
99 })
100 }
101
102 #[inline]
103 fn try_as_i32(&self) -> Result<i32, TryTypeError> {
104 self.as_i32().ok_or(TryTypeError {
105 expected: ValueType::Extended(ExtendedValueType::I32),
106 got: self.value_type(),
107 })
108 }
109
110 #[inline]
111 fn try_as_i16(&self) -> Result<i16, TryTypeError> {
112 self.as_i16().ok_or(TryTypeError {
113 expected: ValueType::Extended(ExtendedValueType::I16),
114 got: self.value_type(),
115 })
116 }
117
118 #[inline]
119 fn try_as_i8(&self) -> Result<i8, TryTypeError> {
120 self.as_i8().ok_or(TryTypeError {
121 expected: ValueType::Extended(ExtendedValueType::I8),
122 got: self.value_type(),
123 })
124 }
125
126 #[inline]
127 fn try_as_u128(&self) -> Result<u128, TryTypeError> {
128 self.as_u128().ok_or(TryTypeError {
129 expected: ValueType::U128,
130 got: self.value_type(),
131 })
132 }
133
134 #[inline]
135 fn try_as_u64(&self) -> Result<u64, TryTypeError> {
136 self.as_u64().ok_or(TryTypeError {
137 expected: ValueType::U64,
138 got: self.value_type(),
139 })
140 }
141
142 #[inline]
143 fn try_as_usize(&self) -> Result<usize, TryTypeError> {
144 self.as_usize().ok_or(TryTypeError {
145 expected: ValueType::Extended(ExtendedValueType::Usize),
146 got: self.value_type(),
147 })
148 }
149
150 #[inline]
151 fn try_as_u32(&self) -> Result<u32, TryTypeError> {
152 self.as_u32().ok_or(TryTypeError {
153 expected: ValueType::Extended(ExtendedValueType::U32),
154 got: self.value_type(),
155 })
156 }
157
158 #[inline]
159 fn try_as_u16(&self) -> Result<u16, TryTypeError> {
160 self.as_u16().ok_or(TryTypeError {
161 expected: ValueType::Extended(ExtendedValueType::U16),
162 got: self.value_type(),
163 })
164 }
165
166 #[inline]
167 fn try_as_u8(&self) -> Result<u8, TryTypeError> {
168 self.as_u8().ok_or(TryTypeError {
169 expected: ValueType::Extended(ExtendedValueType::U8),
170 got: self.value_type(),
171 })
172 }
173
174 #[inline]
175 fn try_as_f64(&self) -> Result<f64, TryTypeError> {
176 self.as_f64().ok_or(TryTypeError {
177 expected: ValueType::F64,
178 got: self.value_type(),
179 })
180 }
181
182 #[inline]
183 #[allow(clippy::cast_precision_loss, clippy::option_if_let_else)]
184 fn try_cast_f64(&self) -> Result<f64, TryTypeError> {
185 if let Some(f) = self.as_f64() {
186 Ok(f)
187 } else if let Some(u) = self.as_u128() {
188 Ok(u as f64)
189 } else {
190 self.try_as_i128().map(|i| i as f64)
191 }
192 }
193
194 #[inline]
195 fn try_as_f32(&self) -> Result<f32, TryTypeError> {
196 self.as_f32().ok_or(TryTypeError {
197 expected: ValueType::Extended(ExtendedValueType::F32),
198 got: self.value_type(),
199 })
200 }
201
202 #[inline]
203 fn try_as_str(&self) -> Result<&str, TryTypeError> {
204 self.as_str().ok_or(TryTypeError {
205 expected: ValueType::String,
206 got: self.value_type(),
207 })
208 }
209
210 #[inline]
211 fn try_as_char(&self) -> Result<char, TryTypeError> {
212 self.as_char().ok_or(TryTypeError {
213 expected: ValueType::Extended(ExtendedValueType::Char),
214 got: self.value_type(),
215 })
216 }
217}
218
219impl<T> ValueTryAsArray for T
220where
221 T: ValueAsArray + TypedValue,
222{
223 type Array = T::Array;
224 #[inline]
225 fn try_as_array(&self) -> Result<&Self::Array, TryTypeError> {
226 self.as_array().ok_or(TryTypeError {
227 expected: ValueType::Array,
228 got: self.value_type(),
229 })
230 }
231}
232impl<T> ValueTryAsArrayMut for T
233where
234 T: ValueAsMutArray + TypedValue,
235 <T as ValueAsMutArray>::Array: array::Array,
236{
237 type Array = T::Array;
238 #[inline]
239 fn try_as_array_mut(&mut self) -> Result<&mut Self::Array, TryTypeError> {
240 let got = self.value_type();
241 self.as_array_mut().ok_or(TryTypeError {
242 expected: ValueType::Array,
243 got,
244 })
245 }
246}
247
248impl<T> ValueTryAsObject for T
249where
250 T: ValueAsObject + TypedValue,
251{
252 type Object = T::Object;
253
254 #[inline]
255 fn try_as_object(&self) -> Result<&Self::Object, TryTypeError> {
256 self.as_object().ok_or(TryTypeError {
257 expected: ValueType::Object,
258 got: self.value_type(),
259 })
260 }
261}
262impl<T> ValueTryAsMutObject for T
263where
264 T: ValueAsMutObject + TypedValue,
265{
266 type Object = T::Object;
267
268 #[inline]
269 fn try_as_object_mut(&mut self) -> Result<&mut Self::Object, TryTypeError> {
270 let got = self.value_type();
271 self.as_object_mut().ok_or(TryTypeError {
272 expected: ValueType::Object,
273 got,
274 })
275 }
276}
277
278impl<T> ValueObjectAccess for T
279where
280 T: ValueAsObject,
281{
282 type Key = <T::Object as Object>::Key;
283 type Target = <T::Object as Object>::Element;
284 #[inline]
285 fn get<Q>(&self, k: &Q) -> Option<&Self::Target>
286 where
287 Self::Key: Borrow<Q>,
288 Q: ?Sized + Hash + Eq + Ord,
289 {
290 self.as_object().and_then(|a| a.get(k))
291 }
292
293 #[inline]
294 fn contains_key<Q>(&self, k: &Q) -> bool
295 where
296 Self::Key: Borrow<Q>,
297 Q: ?Sized + Hash + Eq + Ord,
298 {
299 self.as_object().and_then(|a| a.get(k)).is_some()
300 }
301}
302
303impl<T> ValueObjectTryAccess for T
304where
305 T: ValueTryAsObject,
306{
307 type Key = <T::Object as Object>::Key;
308 type Target = <T::Object as Object>::Element;
309
310 #[inline]
311 fn try_get<Q>(&self, k: &Q) -> Result<Option<&Self::Target>, TryTypeError>
312 where
313 Self::Key: Borrow<Q>,
314 Q: ?Sized + Hash + Eq + Ord,
315 {
316 Ok(self.try_as_object()?.get(k))
317 }
318}
319
320impl<I, T> ValueArrayAccess<I> for T
321where
322 T: ValueAsArray,
323 <T as ValueAsArray>::Array: Indexed<I>,
324{
325 type Target = <<T as ValueAsArray>::Array as Indexed<I>>::Element;
326 #[inline]
327 fn get_idx(&self, i: I) -> Option<&Self::Target> {
328 self.as_array().and_then(|a| a.get(i))
329 }
330}
331
332impl<T> ValueArrayTryAccess for T
333where
334 T: ValueTryAsArray,
335 <T as ValueTryAsArray>::Array: Indexed<usize>,
336{
337 type Target = <<T as ValueTryAsArray>::Array as Indexed<usize>>::Element;
338
339 #[inline]
344 fn try_get_idx(&self, i: usize) -> Result<Option<&Self::Target>, TryTypeError> {
345 Ok(self.try_as_array()?.get(i))
346 }
347}
348
349impl<T> ValueObjectAccessAsScalar for T
350where
351 T: ValueObjectAccess,
352 <T as ValueObjectAccess>::Target: ValueAsScalar,
353{
354 type Key = T::Key;
355 #[inline]
356 fn get_bool<Q>(&self, k: &Q) -> Option<bool>
357 where
358 Self::Key: Borrow<Q>,
359 Q: ?Sized + Hash + Eq + Ord,
360 {
361 self.get(k).and_then(ValueAsScalar::as_bool)
362 }
363
364 #[inline]
365 fn get_i128<Q>(&self, k: &Q) -> Option<i128>
366 where
367 Self::Key: Borrow<Q>,
368 Q: ?Sized + Hash + Eq + Ord,
369 {
370 self.get(k).and_then(ValueAsScalar::as_i128)
371 }
372
373 #[inline]
374 fn get_i64<Q>(&self, k: &Q) -> Option<i64>
375 where
376 Self::Key: Borrow<Q>,
377 Q: ?Sized + Hash + Eq + Ord,
378 {
379 self.get(k).and_then(ValueAsScalar::as_i64)
380 }
381
382 #[inline]
383 fn get_i32<Q>(&self, k: &Q) -> Option<i32>
384 where
385 Self::Key: Borrow<Q>,
386 Q: ?Sized + Hash + Eq + Ord,
387 {
388 self.get(k).and_then(ValueAsScalar::as_i32)
389 }
390
391 #[inline]
392 fn get_i16<Q>(&self, k: &Q) -> Option<i16>
393 where
394 Self::Key: Borrow<Q>,
395 Q: ?Sized + Hash + Eq + Ord,
396 {
397 self.get(k).and_then(ValueAsScalar::as_i16)
398 }
399
400 #[inline]
401 fn get_i8<Q>(&self, k: &Q) -> Option<i8>
402 where
403 Self::Key: Borrow<Q>,
404 Q: ?Sized + Hash + Eq + Ord,
405 {
406 self.get(k).and_then(ValueAsScalar::as_i8)
407 }
408
409 #[inline]
410 fn get_u128<Q>(&self, k: &Q) -> Option<u128>
411 where
412 Self::Key: Borrow<Q>,
413 Q: ?Sized + Hash + Eq + Ord,
414 {
415 self.get(k).and_then(ValueAsScalar::as_u128)
416 }
417
418 #[inline]
419 fn get_u64<Q>(&self, k: &Q) -> Option<u64>
420 where
421 Self::Key: Borrow<Q>,
422 Q: ?Sized + Hash + Eq + Ord,
423 {
424 self.get(k).and_then(ValueAsScalar::as_u64)
425 }
426
427 #[inline]
428 fn get_usize<Q>(&self, k: &Q) -> Option<usize>
429 where
430 Self::Key: Borrow<Q>,
431 Q: ?Sized + Hash + Eq + Ord,
432 {
433 self.get(k).and_then(ValueAsScalar::as_usize)
434 }
435
436 #[inline]
437 fn get_u32<Q>(&self, k: &Q) -> Option<u32>
438 where
439 Self::Key: Borrow<Q>,
440 Q: ?Sized + Hash + Eq + Ord,
441 {
442 self.get(k).and_then(ValueAsScalar::as_u32)
443 }
444
445 #[inline]
446 fn get_u16<Q>(&self, k: &Q) -> Option<u16>
447 where
448 Self::Key: Borrow<Q>,
449 Q: ?Sized + Hash + Eq + Ord,
450 {
451 self.get(k).and_then(ValueAsScalar::as_u16)
452 }
453
454 #[inline]
455 fn get_u8<Q>(&self, k: &Q) -> Option<u8>
456 where
457 Self::Key: Borrow<Q>,
458 Q: ?Sized + Hash + Eq + Ord,
459 {
460 self.get(k).and_then(ValueAsScalar::as_u8)
461 }
462
463 #[inline]
464 fn get_f64<Q>(&self, k: &Q) -> Option<f64>
465 where
466 Self::Key: Borrow<Q>,
467 Q: ?Sized + Hash + Eq + Ord,
468 {
469 self.get(k).and_then(ValueAsScalar::as_f64)
470 }
471
472 #[inline]
473 fn get_f32<Q>(&self, k: &Q) -> Option<f32>
474 where
475 Self::Key: Borrow<Q>,
476 Q: ?Sized + Hash + Eq + Ord,
477 {
478 self.get(k).and_then(ValueAsScalar::as_f32)
479 }
480
481 #[inline]
482 fn get_str<Q>(&self, k: &Q) -> Option<&str>
483 where
484 Self::Key: Borrow<Q>,
485 Q: ?Sized + Hash + Eq + Ord,
486 {
487 self.get(k).and_then(ValueAsScalar::as_str)
488 }
489}
490
491impl<T> ValueObjectAccessAsArray for T
492where
493 T: ValueObjectAccess,
494 T::Target: ValueAsArray,
495{
496 type Key = T::Key;
497
498 type Array = <T::Target as ValueAsArray>::Array;
499
500 #[inline]
501 fn get_array<Q>(&self, k: &Q) -> Option<&Self::Array>
502 where
503 Self::Key: Borrow<Q>,
504 Q: ?Sized + Hash + Eq + Ord,
505 {
506 self.get(k).and_then(ValueAsArray::as_array)
507 }
508}
509
510impl<T> ValueObjectAccessAsObject for T
511where
512 T: ValueObjectAccess,
513 T::Target: ValueAsObject,
514{
515 type Key = T::Key;
516 type Object = <T::Target as ValueAsObject>::Object;
517
518 #[inline]
519 fn get_object<Q>(&self, k: &Q) -> Option<&Self::Object>
520 where
521 Self::Key: Borrow<Q>,
522 Q: ?Sized + Hash + Eq + Ord,
523 {
524 self.get(k).and_then(ValueAsObject::as_object)
525 }
526}
527
528impl<T> ValueObjectAccessTryAsArray for T
529where
530 T: ValueObjectTryAccess + TypedValue,
531 T::Target: ValueTryAsArray,
532{
533 type Key = T::Key;
534
535 type Array = <T::Target as ValueTryAsArray>::Array;
536
537 #[inline]
538 fn try_get_array<Q>(&self, k: &Q) -> Result<Option<&Self::Array>, TryTypeError>
539 where
540 Self::Key: Borrow<Q>,
541 Q: ?Sized + Hash + Eq + Ord,
542 {
543 self.try_get(k)
544 .and_then(|s| s.map(ValueTryAsArray::try_as_array).transpose())
545 }
546}
547impl<T> ValueObjectAccessTryAsObject for T
548where
549 T: ValueObjectTryAccess + TypedValue,
550 T::Target: ValueTryAsObject,
551{
552 type Key = T::Key;
553
554 type Object = <T::Target as ValueTryAsObject>::Object;
555
556 #[inline]
557 fn try_get_object<Q>(&self, k: &Q) -> Result<Option<&Self::Object>, TryTypeError>
558 where
559 Self::Key: Borrow<Q>,
560 Q: ?Sized + Hash + Eq + Ord,
561 {
562 self.try_get(k)
563 .and_then(|s| s.map(ValueTryAsObject::try_as_object).transpose())
564 }
565}
566
567impl<T> ValueObjectAccessTryAsScalar for T
568where
569 T: ValueObjectTryAccess + TypedValue,
570 T::Target: ValueTryAsScalar,
571{
572 type Key = T::Key;
573
574 fn try_get_bool<Q>(&self, k: &Q) -> Result<Option<bool>, TryTypeError>
575 where
576 Self::Key: Borrow<Q>,
577 Q: ?Sized + Hash + Eq + Ord,
578 {
579 self.try_get(k)?
580 .map(ValueTryAsScalar::try_as_bool)
581 .transpose()
582 }
583
584 fn try_get_i128<Q>(&self, k: &Q) -> Result<Option<i128>, TryTypeError>
585 where
586 Self::Key: Borrow<Q>,
587 Q: ?Sized + Hash + Eq + Ord,
588 {
589 self.try_get(k)?
590 .map(ValueTryAsScalar::try_as_i128)
591 .transpose()
592 }
593
594 fn try_get_i64<Q>(&self, k: &Q) -> Result<Option<i64>, TryTypeError>
595 where
596 Self::Key: Borrow<Q>,
597 Q: ?Sized + Hash + Eq + Ord,
598 {
599 self.try_get(k)?
600 .map(ValueTryAsScalar::try_as_i64)
601 .transpose()
602 }
603
604 fn try_get_i32<Q>(&self, k: &Q) -> Result<Option<i32>, TryTypeError>
605 where
606 Self::Key: Borrow<Q>,
607 Q: ?Sized + Hash + Eq + Ord,
608 {
609 self.try_get(k)?
610 .map(ValueTryAsScalar::try_as_i32)
611 .transpose()
612 }
613
614 fn try_get_i16<Q>(&self, k: &Q) -> Result<Option<i16>, TryTypeError>
615 where
616 Self::Key: Borrow<Q>,
617 Q: ?Sized + Hash + Eq + Ord,
618 {
619 self.try_get(k)?
620 .map(ValueTryAsScalar::try_as_i16)
621 .transpose()
622 }
623
624 fn try_get_i8<Q>(&self, k: &Q) -> Result<Option<i8>, TryTypeError>
625 where
626 Self::Key: Borrow<Q>,
627 Q: ?Sized + Hash + Eq + Ord,
628 {
629 self.try_get(k)?
630 .map(ValueTryAsScalar::try_as_i8)
631 .transpose()
632 }
633
634 fn try_get_u128<Q>(&self, k: &Q) -> Result<Option<u128>, TryTypeError>
635 where
636 Self::Key: Borrow<Q>,
637 Q: ?Sized + Hash + Eq + Ord,
638 {
639 self.try_get(k)?
640 .map(ValueTryAsScalar::try_as_u128)
641 .transpose()
642 }
643
644 fn try_get_u64<Q>(&self, k: &Q) -> Result<Option<u64>, TryTypeError>
645 where
646 Self::Key: Borrow<Q>,
647 Q: ?Sized + Hash + Eq + Ord,
648 {
649 self.try_get(k)?
650 .map(ValueTryAsScalar::try_as_u64)
651 .transpose()
652 }
653
654 fn try_get_usize<Q>(&self, k: &Q) -> Result<Option<usize>, TryTypeError>
655 where
656 Self::Key: Borrow<Q>,
657 Q: ?Sized + Hash + Eq + Ord,
658 {
659 self.try_get(k)?
660 .map(ValueTryAsScalar::try_as_usize)
661 .transpose()
662 }
663
664 fn try_get_u32<Q>(&self, k: &Q) -> Result<Option<u32>, TryTypeError>
665 where
666 Self::Key: Borrow<Q>,
667 Q: ?Sized + Hash + Eq + Ord,
668 {
669 self.try_get(k)?
670 .map(ValueTryAsScalar::try_as_u32)
671 .transpose()
672 }
673
674 fn try_get_u16<Q>(&self, k: &Q) -> Result<Option<u16>, TryTypeError>
675 where
676 Self::Key: Borrow<Q>,
677 Q: ?Sized + Hash + Eq + Ord,
678 {
679 self.try_get(k)?
680 .map(ValueTryAsScalar::try_as_u16)
681 .transpose()
682 }
683
684 fn try_get_u8<Q>(&self, k: &Q) -> Result<Option<u8>, TryTypeError>
685 where
686 Self::Key: Borrow<Q>,
687 Q: ?Sized + Hash + Eq + Ord,
688 {
689 self.try_get(k)?
690 .map(ValueTryAsScalar::try_as_u8)
691 .transpose()
692 }
693
694 fn try_get_f64<Q>(&self, k: &Q) -> Result<Option<f64>, TryTypeError>
695 where
696 Self::Key: Borrow<Q>,
697 Q: ?Sized + Hash + Eq + Ord,
698 {
699 self.try_get(k)?
700 .map(ValueTryAsScalar::try_as_f64)
701 .transpose()
702 }
703
704 fn try_get_f32<Q>(&self, k: &Q) -> Result<Option<f32>, TryTypeError>
705 where
706 Self::Key: Borrow<Q>,
707 Q: ?Sized + Hash + Eq + Ord,
708 {
709 self.try_get(k)?
710 .map(ValueTryAsScalar::try_as_f32)
711 .transpose()
712 }
713
714 fn try_get_str<Q>(&self, k: &Q) -> Result<Option<&str>, TryTypeError>
715 where
716 Self::Key: Borrow<Q>,
717 Q: ?Sized + Hash + Eq + Ord,
718 {
719 self.try_get(k)?
720 .map(ValueTryAsScalar::try_as_str)
721 .transpose()
722 }
723}
724
725impl<T> TypedScalarValue for T
726where
727 T: ValueAsScalar,
728{
729 #[inline]
730 fn is_null(&self) -> bool {
731 self.as_null().is_some()
732 }
733
734 #[inline]
735 fn is_float(&self) -> bool {
736 self.is_f64()
737 }
738
739 #[inline]
740 fn is_integer(&self) -> bool {
741 self.is_i128() || self.is_u128()
742 }
743
744 #[inline]
745 fn is_number(&self) -> bool {
746 self.is_float() || self.is_integer()
747 }
748
749 #[inline]
750 fn is_bool(&self) -> bool {
751 self.as_bool().is_some()
752 }
753
754 #[inline]
755 fn is_i128(&self) -> bool {
756 self.as_i128().is_some()
757 }
758
759 #[inline]
760 fn is_i64(&self) -> bool {
761 self.as_i64().is_some()
762 }
763
764 #[inline]
765 fn is_i32(&self) -> bool {
766 self.as_i32().is_some()
767 }
768
769 #[inline]
770 fn is_i16(&self) -> bool {
771 self.as_i16().is_some()
772 }
773
774 #[inline]
775 fn is_i8(&self) -> bool {
776 self.as_i8().is_some()
777 }
778
779 #[inline]
780 fn is_u128(&self) -> bool {
781 self.as_u128().is_some()
782 }
783
784 #[inline]
785 fn is_u64(&self) -> bool {
786 self.as_u64().is_some()
787 }
788
789 #[inline]
790 fn is_usize(&self) -> bool {
791 self.as_usize().is_some()
792 }
793
794 #[inline]
795 fn is_u32(&self) -> bool {
796 self.as_u32().is_some()
797 }
798
799 #[inline]
800 fn is_u16(&self) -> bool {
801 self.as_u16().is_some()
802 }
803
804 #[inline]
805 fn is_u8(&self) -> bool {
806 self.as_u8().is_some()
807 }
808
809 #[inline]
810 fn is_f64(&self) -> bool {
811 self.as_f64().is_some()
812 }
813
814 #[inline]
815 fn is_f64_castable(&self) -> bool {
816 self.cast_f64().is_some()
817 }
818
819 #[inline]
820 fn is_f32(&self) -> bool {
821 self.as_f32().is_some()
822 }
823
824 #[inline]
825 fn is_str(&self) -> bool {
826 self.as_str().is_some()
827 }
828
829 #[inline]
830 fn is_char(&self) -> bool {
831 self.as_char().is_some()
832 }
833}
834
835impl<T> TypedArrayValue for T
836where
837 T: ValueAsArray,
838{
839 #[inline]
840 fn is_array(&self) -> bool {
841 self.as_array().is_some()
842 }
843}
844impl<T> TypedObjectValue for T
845where
846 T: ValueAsObject,
847{
848 #[inline]
849 fn is_object(&self) -> bool {
850 self.as_object().is_some()
851 }
852}
853impl<T> MutableObject for T
854where
855 T: ValueAsMutObject,
856 T::Object: ObjectMut,
857{
858 type Key = <T::Object as ObjectMut>::Key;
859 type Target = <T::Object as ObjectMut>::Element;
860 type Object = T::Object;
861
862 #[inline]
863 fn insert<K, V>(&mut self, k: K, v: V) -> std::result::Result<Option<Self::Target>, AccessError>
864 where
865 Self::Key: From<K> + Hash + Eq,
866 V: Into<Self::Target>,
867 {
868 self.as_object_mut()
869 .ok_or(AccessError::NotAnObject)
870 .map(|o| o.insert(k, v))
871 }
872
873 #[inline]
874 fn remove<Q>(&mut self, k: &Q) -> std::result::Result<Option<Self::Target>, AccessError>
875 where
876 Self::Key: Borrow<Q>,
877 Q: ?Sized + Hash + Eq + Ord,
878 {
879 self.as_object_mut()
880 .ok_or(AccessError::NotAnObject)
881 .map(|o| o.remove(k))
882 }
883 #[inline]
884 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Target>
885 where
886 Self::Key: Borrow<Q>,
887 Q: ?Sized + Hash + Eq + Ord,
888 {
889 self.as_object_mut().and_then(|m| m.get_mut(k))
890 }
891}
892
893impl<T> MutableArray for T
894where
895 T: ValueAsMutArray,
896 T::Array: ArrayMut,
897{
898 type Target = <T::Array as ArrayMut>::Element;
899
900 #[inline]
901 fn push<V>(&mut self, v: V) -> std::result::Result<(), AccessError>
902 where
903 V: Into<Self::Target>,
904 {
905 self.as_array_mut()
906 .ok_or(AccessError::NotAnArray)
907 .map(|o| o.push(v.into()))
908 }
909
910 #[inline]
918 fn pop(&mut self) -> std::result::Result<Option<Self::Target>, AccessError> {
919 self.as_array_mut()
920 .ok_or(AccessError::NotAnArray)
921 .map(ArrayMut::pop)
922 }
923}
924
925impl<T, I> MutableValueArrayAccess<I> for T
926where
927 T: ValueAsMutArray,
928 T::Array: IndexedMut<I>,
929{
930 type Target = <T::Array as IndexedMut<I>>::Element;
931
932 #[inline]
934 fn get_idx_mut(&mut self, i: I) -> Option<&mut Self::Target> {
935 self.as_array_mut().and_then(|a| a.get_mut(i))
936 }
937}