Skip to main content

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}