inspect_core/kind.rs
1//! Kind enumeration for inspectable values.
2
3#[cfg(not(feature = "std"))]
4use alloc::borrow::Cow;
5#[cfg(feature = "std")]
6use std::borrow::Cow;
7
8/// The kind of value being inspected.
9///
10/// This represents the fundamental shape and type of a value, including
11/// scalar types, containers, and structured data.
12#[derive(Debug, Clone, PartialEq)]
13pub enum Kind<'a> {
14 /// The unit type `()`.
15 Unit,
16
17 /// A boolean value.
18 Bool(bool),
19
20 /// A character.
21 Char(char),
22
23 /// A signed 8-bit integer.
24 I8(i8),
25
26 /// A signed 16-bit integer.
27 I16(i16),
28
29 /// A signed 32-bit integer.
30 I32(i32),
31
32 /// A signed 64-bit integer.
33 I64(i64),
34
35 /// A signed 128-bit integer.
36 I128(i128),
37
38 /// A pointer-sized signed integer.
39 Isize(isize),
40
41 /// An unsigned 8-bit integer.
42 U8(u8),
43
44 /// An unsigned 16-bit integer.
45 U16(u16),
46
47 /// An unsigned 32-bit integer.
48 U32(u32),
49
50 /// An unsigned 64-bit integer.
51 U64(u64),
52
53 /// An unsigned 128-bit integer.
54 U128(u128),
55
56 /// A pointer-sized unsigned integer.
57 Usize(usize),
58
59 /// A 32-bit floating point number.
60 F32(f32),
61
62 /// A 64-bit floating point number.
63 F64(f64),
64
65 /// A string value.
66 Str(Cow<'a, str>),
67
68 /// A byte sequence.
69 Bytes(&'a [u8]),
70
71 /// A struct with named fields.
72 Struct,
73
74 /// A tuple with positional fields.
75 Tuple,
76
77 /// A tuple struct with positional fields.
78 TupleStruct,
79
80 /// A sequence (Vec, slice, array).
81 Sequence,
82
83 /// A map (HashMap, BTreeMap).
84 Map,
85
86 /// A set (HashSet, BTreeSet).
87 Set,
88
89 /// An enum with a selected variant.
90 Enum,
91
92 /// An Option value.
93 Option,
94
95 /// A Result value.
96 Result,
97
98 /// An opaque value that doesn't expose internal structure.
99 Opaque,
100}
101
102impl<'a> Kind<'a> {
103 /// Returns a human-readable name for this kind.
104 pub fn name(&self) -> &'static str {
105 match self {
106 Kind::Unit => "()",
107 Kind::Bool(_) => "bool",
108 Kind::Char(_) => "char",
109 Kind::I8(_) => "i8",
110 Kind::I16(_) => "i16",
111 Kind::I32(_) => "i32",
112 Kind::I64(_) => "i64",
113 Kind::I128(_) => "i128",
114 Kind::Isize(_) => "isize",
115 Kind::U8(_) => "u8",
116 Kind::U16(_) => "u16",
117 Kind::U32(_) => "u32",
118 Kind::U64(_) => "u64",
119 Kind::U128(_) => "u128",
120 Kind::Usize(_) => "usize",
121 Kind::F32(_) => "f32",
122 Kind::F64(_) => "f64",
123 Kind::Str(_) => "str",
124 Kind::Bytes(_) => "bytes",
125 Kind::Struct => "struct",
126 Kind::Tuple => "tuple",
127 Kind::TupleStruct => "tuple_struct",
128 Kind::Sequence => "sequence",
129 Kind::Map => "map",
130 Kind::Set => "set",
131 Kind::Enum => "enum",
132 Kind::Option => "Option",
133 Kind::Result => "Result",
134 Kind::Opaque => "opaque",
135 }
136 }
137
138 /// Returns true if this is a scalar kind (primitives without children).
139 pub fn is_scalar(&self) -> bool {
140 matches!(
141 self,
142 Kind::Unit
143 | Kind::Bool(_)
144 | Kind::Char(_)
145 | Kind::I8(_)
146 | Kind::I16(_)
147 | Kind::I32(_)
148 | Kind::I64(_)
149 | Kind::I128(_)
150 | Kind::Isize(_)
151 | Kind::U8(_)
152 | Kind::U16(_)
153 | Kind::U32(_)
154 | Kind::U64(_)
155 | Kind::U128(_)
156 | Kind::Usize(_)
157 | Kind::F32(_)
158 | Kind::F64(_)
159 | Kind::Str(_)
160 | Kind::Bytes(_)
161 )
162 }
163}