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 #[must_use]
286 fn get<Q>(&self, k: &Q) -> Option<&Self::Target>
287 where
288 Self::Key: Borrow<Q>,
289 Q: ?Sized + Hash + Eq + Ord,
290 {
291 self.as_object().and_then(|a| a.get(k))
292 }
293
294 #[inline]
295 #[must_use]
296 fn contains_key<Q>(&self, k: &Q) -> bool
297 where
298 Self::Key: Borrow<Q>,
299 Q: ?Sized + Hash + Eq + Ord,
300 {
301 self.as_object().and_then(|a| a.get(k)).is_some()
302 }
303}
304
305impl<T> ValueObjectTryAccess for T
306where
307 T: ValueTryAsObject,
308{
309 type Key = <T::Object as Object>::Key;
310 type Target = <T::Object as Object>::Element;
311
312 #[inline]
313 fn try_get<Q>(&self, k: &Q) -> Result<Option<&Self::Target>, TryTypeError>
314 where
315 Self::Key: Borrow<Q>,
316 Q: ?Sized + Hash + Eq + Ord,
317 {
318 Ok(self.try_as_object()?.get(k))
319 }
320}
321
322impl<I, T> ValueArrayAccess<I> for T
323where
324 T: ValueAsArray,
325 <T as ValueAsArray>::Array: Indexed<I>,
326{
327 type Target = <<T as ValueAsArray>::Array as Indexed<I>>::Element;
328 #[inline]
329 #[must_use]
330 fn get_idx(&self, i: I) -> Option<&Self::Target> {
331 self.as_array().and_then(|a| a.get(i))
332 }
333}
334
335impl<T> ValueArrayTryAccess for T
336where
337 T: ValueTryAsArray,
338 <T as ValueTryAsArray>::Array: Indexed<usize>,
339{
340 type Target = <<T as ValueTryAsArray>::Array as Indexed<usize>>::Element;
341
342 #[inline]
347 fn try_get_idx(&self, i: usize) -> Result<Option<&Self::Target>, TryTypeError> {
348 Ok(self.try_as_array()?.get(i))
349 }
350}
351
352impl<T> ValueObjectAccessAsScalar for T
353where
354 T: ValueObjectAccess,
355 <T as ValueObjectAccess>::Target: ValueAsScalar,
356{
357 type Key = T::Key;
358 #[inline]
359 #[must_use]
360 fn get_bool<Q>(&self, k: &Q) -> Option<bool>
361 where
362 Self::Key: Borrow<Q>,
363 Q: ?Sized + Hash + Eq + Ord,
364 {
365 self.get(k).and_then(ValueAsScalar::as_bool)
366 }
367
368 #[inline]
369 #[must_use]
370 fn get_i128<Q>(&self, k: &Q) -> Option<i128>
371 where
372 Self::Key: Borrow<Q>,
373 Q: ?Sized + Hash + Eq + Ord,
374 {
375 self.get(k).and_then(ValueAsScalar::as_i128)
376 }
377
378 #[inline]
379 #[must_use]
380 fn get_i64<Q>(&self, k: &Q) -> Option<i64>
381 where
382 Self::Key: Borrow<Q>,
383 Q: ?Sized + Hash + Eq + Ord,
384 {
385 self.get(k).and_then(ValueAsScalar::as_i64)
386 }
387
388 #[inline]
389 #[must_use]
390 fn get_i32<Q>(&self, k: &Q) -> Option<i32>
391 where
392 Self::Key: Borrow<Q>,
393 Q: ?Sized + Hash + Eq + Ord,
394 {
395 self.get(k).and_then(ValueAsScalar::as_i32)
396 }
397
398 #[inline]
399 #[must_use]
400 fn get_i16<Q>(&self, k: &Q) -> Option<i16>
401 where
402 Self::Key: Borrow<Q>,
403 Q: ?Sized + Hash + Eq + Ord,
404 {
405 self.get(k).and_then(ValueAsScalar::as_i16)
406 }
407
408 #[inline]
409 #[must_use]
410 fn get_i8<Q>(&self, k: &Q) -> Option<i8>
411 where
412 Self::Key: Borrow<Q>,
413 Q: ?Sized + Hash + Eq + Ord,
414 {
415 self.get(k).and_then(ValueAsScalar::as_i8)
416 }
417
418 #[inline]
419 #[must_use]
420 fn get_u128<Q>(&self, k: &Q) -> Option<u128>
421 where
422 Self::Key: Borrow<Q>,
423 Q: ?Sized + Hash + Eq + Ord,
424 {
425 self.get(k).and_then(ValueAsScalar::as_u128)
426 }
427
428 #[inline]
429 #[must_use]
430 fn get_u64<Q>(&self, k: &Q) -> Option<u64>
431 where
432 Self::Key: Borrow<Q>,
433 Q: ?Sized + Hash + Eq + Ord,
434 {
435 self.get(k).and_then(ValueAsScalar::as_u64)
436 }
437
438 #[inline]
439 #[must_use]
440 fn get_usize<Q>(&self, k: &Q) -> Option<usize>
441 where
442 Self::Key: Borrow<Q>,
443 Q: ?Sized + Hash + Eq + Ord,
444 {
445 self.get(k).and_then(ValueAsScalar::as_usize)
446 }
447
448 #[inline]
449 #[must_use]
450 fn get_u32<Q>(&self, k: &Q) -> Option<u32>
451 where
452 Self::Key: Borrow<Q>,
453 Q: ?Sized + Hash + Eq + Ord,
454 {
455 self.get(k).and_then(ValueAsScalar::as_u32)
456 }
457
458 #[inline]
459 #[must_use]
460 fn get_u16<Q>(&self, k: &Q) -> Option<u16>
461 where
462 Self::Key: Borrow<Q>,
463 Q: ?Sized + Hash + Eq + Ord,
464 {
465 self.get(k).and_then(ValueAsScalar::as_u16)
466 }
467
468 #[inline]
469 #[must_use]
470 fn get_u8<Q>(&self, k: &Q) -> Option<u8>
471 where
472 Self::Key: Borrow<Q>,
473 Q: ?Sized + Hash + Eq + Ord,
474 {
475 self.get(k).and_then(ValueAsScalar::as_u8)
476 }
477
478 #[inline]
479 #[must_use]
480 fn get_f64<Q>(&self, k: &Q) -> Option<f64>
481 where
482 Self::Key: Borrow<Q>,
483 Q: ?Sized + Hash + Eq + Ord,
484 {
485 self.get(k).and_then(ValueAsScalar::as_f64)
486 }
487
488 #[inline]
489 #[must_use]
490 fn get_f32<Q>(&self, k: &Q) -> Option<f32>
491 where
492 Self::Key: Borrow<Q>,
493 Q: ?Sized + Hash + Eq + Ord,
494 {
495 self.get(k).and_then(ValueAsScalar::as_f32)
496 }
497
498 #[inline]
499 #[must_use]
500 fn get_str<Q>(&self, k: &Q) -> Option<&str>
501 where
502 Self::Key: Borrow<Q>,
503 Q: ?Sized + Hash + Eq + Ord,
504 {
505 self.get(k).and_then(ValueAsScalar::as_str)
506 }
507}
508
509impl<T> ValueObjectAccessAsArray for T
510where
511 T: ValueObjectAccess,
512 T::Target: ValueAsArray,
513{
514 type Key = T::Key;
515
516 type Array = <T::Target as ValueAsArray>::Array;
517
518 #[inline]
519 #[must_use]
520 fn get_array<Q>(&self, k: &Q) -> Option<&Self::Array>
521 where
522 Self::Key: Borrow<Q>,
523 Q: ?Sized + Hash + Eq + Ord,
524 {
525 self.get(k).and_then(ValueAsArray::as_array)
526 }
527}
528
529impl<T> ValueObjectAccessAsObject for T
530where
531 T: ValueObjectAccess,
532 T::Target: ValueAsObject,
533{
534 type Key = T::Key;
535 type Object = <T::Target as ValueAsObject>::Object;
536
537 #[inline]
538 #[must_use]
539 fn get_object<Q>(&self, k: &Q) -> Option<&Self::Object>
540 where
541 Self::Key: Borrow<Q>,
542 Q: ?Sized + Hash + Eq + Ord,
543 {
544 self.get(k).and_then(ValueAsObject::as_object)
545 }
546}
547
548impl<T> ValueObjectAccessTryAsArray for T
549where
550 T: ValueObjectTryAccess + TypedValue,
551 T::Target: ValueTryAsArray,
552{
553 type Key = T::Key;
554
555 type Array = <T::Target as ValueTryAsArray>::Array;
556
557 #[inline]
558 fn try_get_array<Q>(&self, k: &Q) -> Result<Option<&Self::Array>, TryTypeError>
559 where
560 Self::Key: Borrow<Q>,
561 Q: ?Sized + Hash + Eq + Ord,
562 {
563 self.try_get(k)
564 .and_then(|s| s.map(ValueTryAsArray::try_as_array).transpose())
565 }
566}
567impl<T> ValueObjectAccessTryAsObject for T
568where
569 T: ValueObjectTryAccess + TypedValue,
570 T::Target: ValueTryAsObject,
571{
572 type Key = T::Key;
573
574 type Object = <T::Target as ValueTryAsObject>::Object;
575
576 #[inline]
577 fn try_get_object<Q>(&self, k: &Q) -> Result<Option<&Self::Object>, TryTypeError>
578 where
579 Self::Key: Borrow<Q>,
580 Q: ?Sized + Hash + Eq + Ord,
581 {
582 self.try_get(k)
583 .and_then(|s| s.map(ValueTryAsObject::try_as_object).transpose())
584 }
585}
586
587impl<T> ValueObjectAccessTryAsScalar for T
588where
589 T: ValueObjectTryAccess + TypedValue,
590 T::Target: ValueTryAsScalar,
591{
592 type Key = T::Key;
593
594 fn try_get_bool<Q>(&self, k: &Q) -> Result<Option<bool>, 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_bool)
601 .transpose()
602 }
603
604 fn try_get_i128<Q>(&self, k: &Q) -> Result<Option<i128>, 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_i128)
611 .transpose()
612 }
613
614 fn try_get_i64<Q>(&self, k: &Q) -> Result<Option<i64>, 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_i64)
621 .transpose()
622 }
623
624 fn try_get_i32<Q>(&self, k: &Q) -> Result<Option<i32>, 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_i32)
631 .transpose()
632 }
633
634 fn try_get_i16<Q>(&self, k: &Q) -> Result<Option<i16>, 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_i16)
641 .transpose()
642 }
643
644 fn try_get_i8<Q>(&self, k: &Q) -> Result<Option<i8>, 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_i8)
651 .transpose()
652 }
653
654 fn try_get_u128<Q>(&self, k: &Q) -> Result<Option<u128>, 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_u128)
661 .transpose()
662 }
663
664 fn try_get_u64<Q>(&self, k: &Q) -> Result<Option<u64>, 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_u64)
671 .transpose()
672 }
673
674 fn try_get_usize<Q>(&self, k: &Q) -> Result<Option<usize>, 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_usize)
681 .transpose()
682 }
683
684 fn try_get_u32<Q>(&self, k: &Q) -> Result<Option<u32>, 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_u32)
691 .transpose()
692 }
693
694 fn try_get_u16<Q>(&self, k: &Q) -> Result<Option<u16>, 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_u16)
701 .transpose()
702 }
703
704 fn try_get_u8<Q>(&self, k: &Q) -> Result<Option<u8>, 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_u8)
711 .transpose()
712 }
713
714 fn try_get_f64<Q>(&self, k: &Q) -> Result<Option<f64>, 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_f64)
721 .transpose()
722 }
723
724 fn try_get_f32<Q>(&self, k: &Q) -> Result<Option<f32>, TryTypeError>
725 where
726 Self::Key: Borrow<Q>,
727 Q: ?Sized + Hash + Eq + Ord,
728 {
729 self.try_get(k)?
730 .map(ValueTryAsScalar::try_as_f32)
731 .transpose()
732 }
733
734 fn try_get_str<Q>(&self, k: &Q) -> Result<Option<&str>, TryTypeError>
735 where
736 Self::Key: Borrow<Q>,
737 Q: ?Sized + Hash + Eq + Ord,
738 {
739 self.try_get(k)?
740 .map(ValueTryAsScalar::try_as_str)
741 .transpose()
742 }
743}
744
745impl<T> TypedScalarValue for T
746where
747 T: ValueAsScalar,
748{
749 #[inline]
750 #[must_use]
751 fn is_null(&self) -> bool {
752 self.as_null().is_some()
753 }
754
755 #[inline]
756 #[must_use]
757 fn is_float(&self) -> bool {
758 self.is_f64()
759 }
760
761 #[inline]
762 #[must_use]
763 fn is_integer(&self) -> bool {
764 self.is_i128() || self.is_u128()
765 }
766
767 #[inline]
768 #[must_use]
769 fn is_number(&self) -> bool {
770 self.is_float() || self.is_integer()
771 }
772
773 #[inline]
774 #[must_use]
775 fn is_bool(&self) -> bool {
776 self.as_bool().is_some()
777 }
778
779 #[inline]
780 #[must_use]
781 fn is_i128(&self) -> bool {
782 self.as_i128().is_some()
783 }
784
785 #[inline]
786 #[must_use]
787 fn is_i64(&self) -> bool {
788 self.as_i64().is_some()
789 }
790
791 #[inline]
792 #[must_use]
793 fn is_i32(&self) -> bool {
794 self.as_i32().is_some()
795 }
796
797 #[inline]
798 #[must_use]
799 fn is_i16(&self) -> bool {
800 self.as_i16().is_some()
801 }
802
803 #[inline]
804 #[must_use]
805 fn is_i8(&self) -> bool {
806 self.as_i8().is_some()
807 }
808
809 #[inline]
810 #[must_use]
811 fn is_u128(&self) -> bool {
812 self.as_u128().is_some()
813 }
814
815 #[inline]
816 #[must_use]
817 fn is_u64(&self) -> bool {
818 self.as_u64().is_some()
819 }
820
821 #[inline]
822 #[must_use]
823 fn is_usize(&self) -> bool {
824 self.as_usize().is_some()
825 }
826
827 #[inline]
828 #[must_use]
829 fn is_u32(&self) -> bool {
830 self.as_u32().is_some()
831 }
832
833 #[inline]
834 #[must_use]
835 fn is_u16(&self) -> bool {
836 self.as_u16().is_some()
837 }
838
839 #[inline]
840 #[must_use]
841 fn is_u8(&self) -> bool {
842 self.as_u8().is_some()
843 }
844
845 #[inline]
846 #[must_use]
847 fn is_f64(&self) -> bool {
848 self.as_f64().is_some()
849 }
850
851 #[inline]
852 #[must_use]
853 fn is_f64_castable(&self) -> bool {
854 self.cast_f64().is_some()
855 }
856
857 #[inline]
858 #[must_use]
859 fn is_f32(&self) -> bool {
860 self.as_f32().is_some()
861 }
862
863 #[inline]
864 #[must_use]
865 fn is_str(&self) -> bool {
866 self.as_str().is_some()
867 }
868
869 #[inline]
870 #[must_use]
871 fn is_char(&self) -> bool {
872 self.as_char().is_some()
873 }
874}
875
876impl<T> TypedArrayValue for T
877where
878 T: ValueAsArray,
879{
880 #[inline]
881 #[must_use]
882 fn is_array(&self) -> bool {
883 self.as_array().is_some()
884 }
885}
886impl<T> TypedObjectValue for T
887where
888 T: ValueAsObject,
889{
890 #[inline]
891 #[must_use]
892 fn is_object(&self) -> bool {
893 self.as_object().is_some()
894 }
895}
896impl<T> MutableObject for T
897where
898 T: ValueAsMutObject,
899 T::Object: ObjectMut,
900{
901 type Key = <T::Object as ObjectMut>::Key;
902 type Target = <T::Object as ObjectMut>::Element;
903 type Object = T::Object;
904
905 #[inline]
906 fn insert<K, V>(&mut self, k: K, v: V) -> std::result::Result<Option<Self::Target>, AccessError>
907 where
908 Self::Key: From<K> + Hash + Eq,
909 V: Into<Self::Target>,
910 {
911 self.as_object_mut()
912 .ok_or(AccessError::NotAnObject)
913 .map(|o| o.insert(k, v))
914 }
915
916 #[inline]
917 fn remove<Q>(&mut self, k: &Q) -> std::result::Result<Option<Self::Target>, AccessError>
918 where
919 Self::Key: Borrow<Q>,
920 Q: ?Sized + Hash + Eq + Ord,
921 {
922 self.as_object_mut()
923 .ok_or(AccessError::NotAnObject)
924 .map(|o| o.remove(k))
925 }
926 #[inline]
927 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Target>
928 where
929 Self::Key: Borrow<Q>,
930 Q: ?Sized + Hash + Eq + Ord,
931 {
932 self.as_object_mut().and_then(|m| m.get_mut(k))
933 }
934}
935
936impl<T> MutableArray for T
937where
938 T: ValueAsMutArray,
939 T::Array: ArrayMut,
940{
941 type Target = <T::Array as ArrayMut>::Element;
942
943 #[inline]
944 fn push<V>(&mut self, v: V) -> std::result::Result<(), AccessError>
945 where
946 V: Into<Self::Target>,
947 {
948 self.as_array_mut()
949 .ok_or(AccessError::NotAnArray)
950 .map(|o| o.push(v.into()))
951 }
952
953 #[inline]
961 fn pop(&mut self) -> std::result::Result<Option<Self::Target>, AccessError> {
962 self.as_array_mut()
963 .ok_or(AccessError::NotAnArray)
964 .map(ArrayMut::pop)
965 }
966}
967
968impl<T, I> MutableValueArrayAccess<I> for T
969where
970 T: ValueAsMutArray,
971 T::Array: IndexedMut<I>,
972{
973 type Target = <T::Array as IndexedMut<I>>::Element;
974
975 #[inline]
977 fn get_idx_mut(&mut self, i: I) -> Option<&mut Self::Target> {
978 self.as_array_mut().and_then(|a| a.get_mut(i))
979 }
980}