Skip to main content

inspect_core/
field.rs

1//! Field metadata.
2
3#[cfg(not(feature = "std"))]
4use alloc::borrow::Cow;
5#[cfg(feature = "std")]
6use std::borrow::Cow;
7
8use crate::Sensitivity;
9
10/// Metadata about a struct field or tuple element.
11#[derive(Debug, Clone, PartialEq, Eq)]
12pub struct FieldInfo<'a> {
13    name: Option<Cow<'a, str>>,
14    index: usize,
15    type_name: Option<Cow<'a, str>>,
16    sensitivity: Sensitivity,
17}
18
19impl<'a> FieldInfo<'a> {
20    /// Create field information for a named field.
21    pub fn named(name: impl Into<Cow<'a, str>>, index: usize) -> Self {
22        Self { name: Some(name.into()), index, type_name: None, sensitivity: Sensitivity::Normal }
23    }
24
25    /// Create field information for a tuple field.
26    pub fn tuple(index: usize) -> Self {
27        Self { name: None, index, type_name: None, sensitivity: Sensitivity::Normal }
28    }
29
30    /// Set the type name for this field.
31    pub fn with_type_name(mut self, type_name: impl Into<Cow<'a, str>>) -> Self {
32        self.type_name = Some(type_name.into());
33        self
34    }
35
36    /// Set the sensitivity level for this field.
37    pub fn with_sensitivity(mut self, sensitivity: Sensitivity) -> Self {
38        self.sensitivity = sensitivity;
39        self
40    }
41
42    /// The field's name, if it has one (struct fields).
43    pub fn name(&self) -> Option<&str> {
44        self.name.as_deref()
45    }
46
47    /// The field's index in its parent container.
48    pub fn index(&self) -> usize {
49        self.index
50    }
51
52    /// The field's type name, if available.
53    pub fn type_name(&self) -> Option<&str> {
54        self.type_name.as_deref()
55    }
56
57    /// The field's sensitivity classification.
58    pub fn sensitivity(&self) -> Sensitivity {
59        self.sensitivity
60    }
61}