Enum bonsaidb::core::transmog_pot::pot::Value
pub enum Value<'a> {
None,
Unit,
Bool(bool),
Integer(Integer),
Float(Float),
Bytes(Cow<'a, [u8]>),
String(Cow<'a, str>),
Sequence(Vec<Value<'a>, Global>),
Mappings(Vec<(Value<'a>, Value<'a>), Global>),
}
Expand description
A Pot-encoded value. This type can be used to deserialize to and from Pot without knowing the original data structure.
Variants§
None
A value representing None
.
Unit
A value representing unit (()
).
Bool(bool)
A boolean value
Integer(Integer)
An integer value.
Float(Float)
A floating point value.
Bytes(Cow<'a, [u8]>)
A value containing arbitrary bytes.
String(Cow<'a, str>)
A string value.
Sequence(Vec<Value<'a>, Global>)
A sequence of values.
Mappings(Vec<(Value<'a>, Value<'a>), Global>)
A sequence of key-value mappings.
Implementations§
§impl<'a> Value<'a>
impl<'a> Value<'a>
pub fn from_serialize<T>(value: T) -> Result<Value<'a>, ValueError>where
T: Serialize,
pub fn from_serialize<T>(value: T) -> Result<Value<'a>, ValueError>where T: Serialize,
Creates a Value
from the given Serde-compatible type.
use pot::Value;
use serde_derive::Serialize;
#[derive(Serialize, Debug)]
enum Example {
Hello,
World,
}
let original = vec![Example::Hello, Example::World];
let serialized = Value::from_serialize(&original)?;
assert_eq!(
serialized,
Value::Sequence(vec![
Value::from(String::from("Hello")),
Value::from(String::from("World"))
])
);
pub fn deserialize_as<'de, T>(&'de self) -> Result<T, ValueError>where
T: Deserialize<'de>,
pub fn deserialize_as<'de, T>(&'de self) -> Result<T, ValueError>where T: Deserialize<'de>,
Attempts to create an instance of T
from this value.
use pot::Value;
use serde_derive::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)]
enum Example {
Hello,
World,
}
let original = vec![Example::Hello, Example::World];
let serialized = Value::from_serialize(&original)?;
let deserialized: Vec<Example> = serialized.deserialize_as()?;
assert_eq!(deserialized, original);
pub fn from_sequence<IntoIter, T>(sequence: IntoIter) -> Value<'a>where
IntoIter: IntoIterator<Item = T>,
T: Into<Value<'a>>,
pub fn from_sequence<IntoIter, T>(sequence: IntoIter) -> Value<'a>where IntoIter: IntoIterator<Item = T>, T: Into<Value<'a>>,
Returns a new value from an iterator of items that can be converted into a value.
let mappings = Value::from_sequence(Vec::<String>::new());
assert!(matches!(mappings, Value::Sequence(_)));
pub fn from_mappings<IntoIter, K, V>(mappings: IntoIter) -> Value<'a>where
IntoIter: IntoIterator<Item = (K, V)>,
K: Into<Value<'a>>,
V: Into<Value<'a>>,
pub fn from_mappings<IntoIter, K, V>(mappings: IntoIter) -> Value<'a>where IntoIter: IntoIterator<Item = (K, V)>, K: Into<Value<'a>>, V: Into<Value<'a>>,
Returns a new value from an iterator of 2-element tuples representing key-value pairs.
let mappings = Value::from_mappings(HashMap::<String, u32>::new());
assert!(matches!(mappings, Value::Mappings(_)));
pub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if the value contained is considered empty.
// Value::None is always empty.
assert_eq!(Value::None.is_empty(), true);
// All primitive values, including Unit, are always not empty, even if they contain the value 0.
assert_eq!(Value::Unit.is_empty(), false);
assert_eq!(Value::from(false).is_empty(), false);
assert_eq!(Value::from(0_u8).is_empty(), false);
assert_eq!(Value::from(0_f32).is_empty(), false);
// For all other types, having a length of 0 will result in is_empty returning true.
assert_eq!(Value::from(Vec::<u8>::new()).is_empty(), true);
assert_eq!(Value::from(b"").is_empty(), true);
assert_eq!(Value::from(vec![0_u8]).is_empty(), false);
assert_eq!(Value::from("").is_empty(), true);
assert_eq!(Value::from("hi").is_empty(), false);
assert_eq!(Value::Sequence(Vec::new()).is_empty(), true);
assert_eq!(Value::from(vec![Value::None]).is_empty(), false);
assert_eq!(Value::Mappings(Vec::new()).is_empty(), true);
assert_eq!(
Value::from(vec![(Value::None, Value::None)]).is_empty(),
false
);
pub fn as_bool(&self) -> bool
pub fn as_bool(&self) -> bool
Returns the value as a bool
.
// Value::None is always false.
assert_eq!(Value::None.as_bool(), false);
// Value::Unit is always true.
assert_eq!(Value::Unit.as_bool(), true);
// Value::Bool will return the contained value
assert_eq!(Value::from(false).as_bool(), false);
assert_eq!(Value::from(true).as_bool(), true);
// All primitive values return true if the value is non-zero.
assert_eq!(Value::from(0_u8).as_bool(), false);
assert_eq!(Value::from(1_u8).as_bool(), true);
assert_eq!(Value::from(0_f32).as_bool(), false);
assert_eq!(Value::from(1_f32).as_bool(), true);
// For all other types, as_bool() returns the result of `!is_empty()`.
assert_eq!(Value::from(Vec::<u8>::new()).as_bool(), false);
assert_eq!(Value::from(b"").as_bool(), false);
assert_eq!(Value::from(vec![0_u8]).as_bool(), true);
assert_eq!(Value::from("").as_bool(), false);
assert_eq!(Value::from("hi").as_bool(), true);
assert_eq!(Value::Sequence(Vec::new()).as_bool(), false);
assert_eq!(Value::from(vec![Value::None]).as_bool(), true);
assert_eq!(Value::Mappings(Vec::new()).as_bool(), false);
assert_eq!(
Value::from(vec![(Value::None, Value::None)]).as_bool(),
true
);
pub fn as_integer(&self) -> Option<Integer>
pub fn as_integer(&self) -> Option<Integer>
Returns the value as an Integer
. Returns None
if the value is not a
Self::Float
or Self::Integer
. Also returns None
if the value is
a float, but cannot be losslessly converted to an integer.
pub fn as_float(&self) -> Option<Float>
pub fn as_float(&self) -> Option<Float>
Returns the value as an Float
. Returns None
if the value is not a
Self::Float
or Self::Integer
. Also returns None
if the value is
an integer, but cannot be losslessly converted to a float.
pub fn as_str(&self) -> Option<&str>
pub fn as_str(&self) -> Option<&str>
Returns the value as a string, or None
if the value is not representable
by a string. This will only return a value with variants
Self::String
and Self::Bytes
. Bytes will only be returned if the
contained bytes can be safely interpretted as UTF-8.
pub fn as_bytes(&self) -> Option<&[u8]>
pub fn as_bytes(&self) -> Option<&[u8]>
Returns the value as bytes, or None
if the value is not stored as a
representation of bytes. This will only return a value with variants
Self::String
and Self::Bytes
.
pub fn values(&self) -> ValueIter<'_> ⓘ
pub fn values(&self) -> ValueIter<'_> ⓘ
Returns an iterator that iterates over all values contained inside of
this value. Returns an empty iterator if not a Self::Sequence
or
Self::Mappings
. If a Self::Mappings
, only the value portion of
the mapping is returned.
pub fn mappings(&self) -> Iter<'_, (Value<'a>, Value<'a>)>
pub fn mappings(&self) -> Iter<'_, (Value<'a>, Value<'a>)>
Returns an iterator that iterates over all mappings contained inside of
this value. Returns an empty iterator if not a Self::Sequence
or
Self::Mappings
. If a Self::Sequence
, the key will always be
Self::None
.
pub fn into_static(self) -> Value<'static>
pub fn into_static(self) -> Value<'static>
Converts self
to a 'static
lifetime by cloning any borrowed data.