#[cfg(not(feature = "std"))]
use alloc::{boxed::Box, vec::Vec};
use crate::{Capability, FieldInfo, Kind, Sensitivity, TypeInfo, VariantInfo};
#[derive(Debug)]
pub struct ValueRef<'a> {
kind: Kind<'a>,
type_info: TypeInfo<'a>,
children: Option<Children<'a>>,
variant: Option<VariantInfo<'a>>,
sensitivity: Sensitivity,
capability: Capability,
}
impl<'a> ValueRef<'a> {
pub fn with_type(kind: Kind<'a>, type_info: TypeInfo<'a>) -> Self {
let capability = if kind.is_scalar() { Capability::INSPECT } else { Capability::READ_ALL };
Self {
kind,
type_info,
children: None,
variant: None,
sensitivity: Sensitivity::Normal,
capability,
}
}
pub fn with_children(kind: Kind<'a>, type_info: TypeInfo<'a>, children: Children<'a>) -> Self {
Self {
kind,
type_info,
children: Some(children),
variant: None,
sensitivity: Sensitivity::Normal,
capability: Capability::READ_ALL,
}
}
pub fn with_variant(mut self, variant: VariantInfo<'a>) -> Self {
self.variant = Some(variant);
self
}
pub fn with_sensitivity(mut self, sensitivity: Sensitivity) -> Self {
self.sensitivity = sensitivity;
self
}
pub fn kind(&self) -> &Kind<'a> {
&self.kind
}
pub fn type_info(&self) -> &TypeInfo<'a> {
&self.type_info
}
pub fn children(&self) -> Option<&Children<'a>> {
self.children.as_ref()
}
pub fn variant(&self) -> Option<&VariantInfo<'a>> {
self.variant.as_ref()
}
pub fn sensitivity(&self) -> Sensitivity {
self.sensitivity
}
pub fn capability(&self) -> Capability {
self.capability
}
}
#[derive(Debug)]
pub enum Children<'a> {
Direct(Vec<(FieldInfo<'a>, ValueRef<'a>)>),
}
impl<'a> Children<'a> {
pub fn direct(fields: Vec<(FieldInfo<'a>, ValueRef<'a>)>) -> Self {
Self::Direct(fields)
}
pub fn len(&self) -> usize {
match self {
Children::Direct(fields) => fields.len(),
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}