Skip to main content

PropertyValue

Enum PropertyValue 

Source
pub enum PropertyValue {
    Null,
    Bool(bool),
    Integer(i64),
    Unsigned(u64),
    Number(f64),
    Text(String),
    Array(Vec<Self>),
    Container(BTreeMap<String, Self>),
}
Expand description

One value from a PropertyObject tree, in a form serde can handle.

The representation is untagged, so the serialized form is ordinary data, a container becomes an object, an array becomes a list, a scalar becomes a scalar, rather than something carrying wrapper keys.

The engine distinguishes three numeric storages and matches them strictly, so they are separate variants here: collapsing them to one would lose the exactness that Integer and Unsigned exist to provide.

Variant order matters for deserialization: serde tries untagged variants top to bottom, so an integral JSON number is read as Integer and only a value too large for i64 falls through to Unsigned, with fractional values reaching Number.

§Representation is not round-trip stable through plain JSON

JSON has one number type, so a value that fits both signed and unsigned, /// 0, or anything up to i64::MAX, comes back as Integer even if it left as Unsigned. The number is preserved exactly; only the engine’s choice of storage is not.

This is a property of the wire format, not a defect here, and it is the price of emitting ordinary JSON instead of tagged objects. It matters only when rebuilding a property whose representation must be unsigned: read the representation from the live PropertyObjectType rather than inferring it from deserialized JSON. Values above i64::MAX are unambiguous and do survive.

Variants§

§

Null

No value.

Produced for any non-finite number. The engine names three of these: NAN (not a number), IND (indeterminate, a special quiet NaN, from operations such as Sqrt(-1), which the engine treats as equivalent to NAN in comparisons), and INF.

JSON cannot write any of them, and inventing an encoding would force every consumer to learn it, so they all serialize as null, which any language already understands. An empty object reference is not null here: it round-trips as the string "Nothing", so a reference stays distinguishable from a missing number.

§

Bool(bool)

A boolean.

§

Integer(i64)

A number stored as a signed 64-bit integer.

§

Unsigned(u64)

A number stored as an unsigned 64-bit integer.

§

Number(f64)

A number stored as a double.

§

Text(String)

A string.

§

Array(Vec<Self>)

An array. TestStand arrays are homogeneous.

§

Container(BTreeMap<String, Self>)

A container, keyed by sub-property name.

Ordered rather than hashed so a serialized tree is stable between runs and diffable.

Trait Implementations§

Source§

impl Clone for PropertyValue

Source§

fn clone(&self) -> PropertyValue

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PropertyValue

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for PropertyValue

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for PropertyValue

Source§

fn eq(&self, other: &PropertyValue) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for PropertyValue

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for PropertyValue

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.