Skip to main content

inspect_core/
impls_std.rs

1//! Inspect implementations for standard library types.
2
3#[cfg(not(feature = "std"))]
4use alloc::{boxed::Box, string::ToString, vec::Vec};
5#[cfg(feature = "std")]
6use std::collections::{HashMap, HashSet};
7
8use crate::{Children, FieldInfo, Inspect, InspectCx, Kind, TypeInfo, ValueRef, VariantInfo};
9
10// Option<T>
11impl<T: Inspect> Inspect for Option<T> {
12    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
13        cx.visit_node();
14
15        match self {
16            Some(value) => {
17                let variant = VariantInfo::new("Some", 1);
18                let child = value.inspect(cx);
19                let field = FieldInfo::tuple(0);
20
21                ValueRef::with_children(
22                    Kind::Option,
23                    TypeInfo::new("Option"),
24                    Children::direct(vec![(field, child)]),
25                )
26                .with_variant(variant)
27            }
28            None => {
29                let variant = VariantInfo::new("None", 0);
30                ValueRef::with_children(
31                    Kind::Option,
32                    TypeInfo::new("Option"),
33                    Children::direct(vec![]),
34                )
35                .with_variant(variant)
36            }
37        }
38    }
39}
40
41// Result<T, E>
42impl<T: Inspect, E: Inspect> Inspect for Result<T, E> {
43    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
44        cx.visit_node();
45
46        match self {
47            Ok(value) => {
48                let variant = VariantInfo::new("Ok", 0);
49                let child = value.inspect(cx);
50                let field = FieldInfo::tuple(0);
51
52                ValueRef::with_children(
53                    Kind::Result,
54                    TypeInfo::new("Result"),
55                    Children::direct(vec![(field, child)]),
56                )
57                .with_variant(variant)
58            }
59            Err(error) => {
60                let variant = VariantInfo::new("Err", 1);
61                let child = error.inspect(cx);
62                let field = FieldInfo::tuple(0);
63
64                ValueRef::with_children(
65                    Kind::Result,
66                    TypeInfo::new("Result"),
67                    Children::direct(vec![(field, child)]),
68                )
69                .with_variant(variant)
70            }
71        }
72    }
73}
74
75// Vec<T>
76impl<T: Inspect> Inspect for Vec<T> {
77    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
78        cx.visit_node();
79
80        let len = self.len();
81        let max_items = cx.limits().max_items;
82        let display_len = len.min(max_items);
83
84        let children: Vec<_> = self
85            .iter()
86            .take(display_len)
87            .enumerate()
88            .map(|(idx, item)| {
89                let field = FieldInfo::tuple(idx);
90                (field, item.inspect(cx))
91            })
92            .collect();
93
94        ValueRef::with_children(Kind::Sequence, TypeInfo::new("Vec"), Children::direct(children))
95    }
96}
97
98// Array [T; N]
99impl<T: Inspect, const N: usize> Inspect for [T; N] {
100    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
101        cx.visit_node();
102
103        let max_items = cx.limits().max_items;
104        let display_len = N.min(max_items);
105
106        let children: Vec<_> = self
107            .iter()
108            .take(display_len)
109            .enumerate()
110            .map(|(idx, item)| {
111                let field = FieldInfo::tuple(idx);
112                (field, item.inspect(cx))
113            })
114            .collect();
115
116        ValueRef::with_children(Kind::Sequence, TypeInfo::new("[T; N]"), Children::direct(children))
117    }
118}
119
120// Tuples
121impl<T0: Inspect> Inspect for (T0,) {
122    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
123        cx.visit_node();
124        let children = vec![(FieldInfo::tuple(0), self.0.inspect(cx))];
125        ValueRef::with_children(Kind::Tuple, TypeInfo::new("tuple"), Children::direct(children))
126    }
127}
128
129impl<T0: Inspect, T1: Inspect> Inspect for (T0, T1) {
130    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
131        cx.visit_node();
132        let children = vec![
133            (FieldInfo::tuple(0), self.0.inspect(cx)),
134            (FieldInfo::tuple(1), self.1.inspect(cx)),
135        ];
136        ValueRef::with_children(Kind::Tuple, TypeInfo::new("tuple"), Children::direct(children))
137    }
138}
139
140impl<T0: Inspect, T1: Inspect, T2: Inspect> Inspect for (T0, T1, T2) {
141    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
142        cx.visit_node();
143        let children = vec![
144            (FieldInfo::tuple(0), self.0.inspect(cx)),
145            (FieldInfo::tuple(1), self.1.inspect(cx)),
146            (FieldInfo::tuple(2), self.2.inspect(cx)),
147        ];
148        ValueRef::with_children(Kind::Tuple, TypeInfo::new("tuple"), Children::direct(children))
149    }
150}
151
152// HashMap (std only)
153#[cfg(feature = "std")]
154impl<K: Inspect, V: Inspect> Inspect for HashMap<K, V> {
155    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
156        cx.visit_node();
157
158        let max_items = cx.limits().max_items;
159        let display_len = self.len().min(max_items);
160
161        let children: Vec<_> = self
162            .iter()
163            .take(display_len)
164            .enumerate()
165            .map(|(idx, (_k, v))| {
166                let field = FieldInfo::tuple(idx);
167                (field, v.inspect(cx))
168            })
169            .collect();
170
171        ValueRef::with_children(Kind::Map, TypeInfo::new("HashMap"), Children::direct(children))
172    }
173}
174
175// HashSet (std only)
176#[cfg(feature = "std")]
177impl<T: Inspect> Inspect for HashSet<T> {
178    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
179        cx.visit_node();
180
181        let max_items = cx.limits().max_items;
182        let display_len = self.len().min(max_items);
183
184        let children: Vec<_> = self
185            .iter()
186            .take(display_len)
187            .enumerate()
188            .map(|(idx, item)| {
189                let field = FieldInfo::tuple(idx);
190                (field, item.inspect(cx))
191            })
192            .collect();
193
194        ValueRef::with_children(Kind::Set, TypeInfo::new("HashSet"), Children::direct(children))
195    }
196}
197
198// References
199impl<T: Inspect + ?Sized> Inspect for &T {
200    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
201        (*self).inspect(cx)
202    }
203}
204
205impl<T: Inspect + ?Sized> Inspect for &mut T {
206    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
207        (**self).inspect(cx)
208    }
209}
210
211// Box
212impl<T: Inspect + ?Sized> Inspect for Box<T> {
213    fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
214        (**self).inspect(cx)
215    }
216}