1#[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
10impl<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
41impl<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
75impl<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
98impl<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
120impl<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#[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#[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
198impl<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
211impl<T: Inspect + ?Sized> Inspect for Box<T> {
213 fn inspect(&self, cx: &mut InspectCx<'_>) -> ValueRef<'_> {
214 (**self).inspect(cx)
215 }
216}