#[non_exhaustive]pub enum JsonField<'a> {
Value(&'a Value),
Missing(SnapshotError),
}Expand description
One value’s view at the leaf of a dotted-path walk over a
serde_json::Value. Returned by stats_path / StatsValue::get.
Mirrors the super::SnapshotField shape so test authors who already
know the BPF-snapshot accessor surface get the same as_u64 /
as_i64 / as_f64 / as_bool / as_str terminals on the
scx_stats JSON projection. Errors flow through the same
SnapshotError variants — FieldNotFound carries the
available object keys, NotAStruct flags a non-object cursor,
TypeMismatch reports the actual JSON shape — so failure-path
rendering in temporal assertions is identical regardless of
which side of the
Sample bundle the lookup
originated on.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Value(&'a Value)
Resolved JSON value at the leaf of the path walk.
Missing(SnapshotError)
Path could not be resolved.
Implementations§
Source§impl<'a> JsonField<'a>
impl<'a> JsonField<'a>
Sourcepub fn is_present(&self) -> bool
pub fn is_present(&self) -> bool
True when the path resolved.
Sourcepub fn error(&self) -> Option<&SnapshotError>
pub fn error(&self) -> Option<&SnapshotError>
Error reference when the path could not be resolved.
Sourcepub fn get(&self, path: &str) -> JsonField<'a>
pub fn get(&self, path: &str) -> JsonField<'a>
Walk further into a sub-field. Composable with the result of
stats_path — stats_path(v, "layers").get("batch.util")
is the canonical “drill into a periodic-stats object” shape.
Mirrors super::SnapshotField::get so a test author moves
between the BTF-rendered and JSON-rendered surfaces without
re-learning the navigator method name.
Sourcepub fn as_u64(&self) -> SnapshotResult<u64>
pub fn as_u64(&self) -> SnapshotResult<u64>
Read as u64. Accepts JSON integers (positive only), JSON
booleans (true → 1, false → 0), JSON strings whose
content parses as a u64 (scx_stats sometimes stringifies
large counters to avoid 53-bit float collapse), and JSON
floats that are integral and non-negative (5.0 → 5;
fractional, negative, or non-finite floats error). Returns
SnapshotError::TypeMismatch otherwise.
Sourcepub fn as_i64(&self) -> SnapshotResult<i64>
pub fn as_i64(&self) -> SnapshotResult<i64>
Read as i64. Accepts JSON integers (any sign), JSON
booleans (true → 1, false → 0), JSON strings whose
content parses as an i64, and integral finite JSON floats
(9.0 → 9; fractional or non-finite floats error).
Sourcepub fn as_f64(&self) -> SnapshotResult<f64>
pub fn as_f64(&self) -> SnapshotResult<f64>
Read as f64. Accepts JSON numbers (integers and
floating-point) and JSON strings whose content parses as
f64.
Sourcepub fn as_bool(&self) -> SnapshotResult<bool>
pub fn as_bool(&self) -> SnapshotResult<bool>
Read as bool. Accepts JSON booleans directly; rejects
everything else. Distinct from as_u64() != 0 so the call
site reads honestly: a bool claim wants a JSON true/
false, not a stringified "1" that happens to parse.
Sourcepub fn as_str(&self) -> SnapshotResult<&'a str>
pub fn as_str(&self) -> SnapshotResult<&'a str>
Read as &str. Accepts JSON strings only.
Sourcepub fn as_u64_array(&self) -> SnapshotResult<Vec<u64>>
pub fn as_u64_array(&self) -> SnapshotResult<Vec<u64>>
Read as Vec<u64> from a serde_json::Value::Array whose
every element coerces via Self::as_u64’s rules. Mirrors
super::SnapshotField::as_u64_array so JSON-side stats
reads use the same method name as BTF-side BPF reads.
Sourcepub fn as_u32_array(&self) -> SnapshotResult<Vec<u32>>
pub fn as_u32_array(&self) -> SnapshotResult<Vec<u32>>
Read as Vec<u32> from a JSON array. Mirrors
super::SnapshotField::as_u32_array; out-of-range values
error rather than silently truncate.
Sourcepub fn as_i64_array(&self) -> SnapshotResult<Vec<i64>>
pub fn as_i64_array(&self) -> SnapshotResult<Vec<i64>>
Read as Vec<i64> from a JSON array. Mirrors
super::SnapshotField::as_i64_array.
Sourcepub fn as_f64_array(&self) -> SnapshotResult<Vec<f64>>
pub fn as_f64_array(&self) -> SnapshotResult<Vec<f64>>
Read as Vec<f64> from a JSON array. Mirrors
super::SnapshotField::as_f64_array.
Sourcepub fn as_bool_array(&self) -> SnapshotResult<Vec<bool>>
pub fn as_bool_array(&self) -> SnapshotResult<Vec<bool>>
Read as Vec<bool> from a JSON array of booleans. Mirrors
super::SnapshotField::as_bool_array; rejects mixed
arrays (no implicit truthiness coercion — JSON-side bool
already has a wire shape).
Sourcepub fn iter_members(&self) -> impl Iterator<Item = JsonField<'a>> + '_
pub fn iter_members(&self) -> impl Iterator<Item = JsonField<'a>> + '_
Iterate the elements of a JSON array as JsonFields so
chained navigation composes for arrays-of-objects:
field.iter_members().filter_map(|el| el.get("name").as_u64().ok()).
Mirrors super::SnapshotField::iter_members.
Yields nothing for non-array values or missing fields —
the empty iterator is the natural “no elements” shape when
the chain just wants to fold over what’s there. Callers
needing to distinguish “absent” from “empty” check
Self::is_present or Self::error explicitly.
Trait Implementations§
Auto Trait Implementations§
impl<'a> Freeze for JsonField<'a>
impl<'a> RefUnwindSafe for JsonField<'a>
impl<'a> Send for JsonField<'a>
impl<'a> Sync for JsonField<'a>
impl<'a> Unpin for JsonField<'a>
impl<'a> UnwindSafe for JsonField<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more