1 //! Structured values.
2 
3 mod fill;
4 mod impls;
5 mod internal;
6 
7 #[cfg(test)]
8 pub(in kv) mod test;
9 
10 pub use self::fill::{Fill, Slot};
11 pub use kv::Error;
12 
13 use self::internal::{Inner, Primitive, Visitor};
14 
15 /// A type that can be converted into a [`Value`](struct.Value.html).
16 pub trait ToValue {
17     /// Perform the conversion.
to_value(&self) -> Value18     fn to_value(&self) -> Value;
19 }
20 
21 impl<'a, T> ToValue for &'a T
22 where
23     T: ToValue + ?Sized,
24 {
to_value(&self) -> Value25     fn to_value(&self) -> Value {
26         (**self).to_value()
27     }
28 }
29 
30 impl<'v> ToValue for Value<'v> {
to_value(&self) -> Value31     fn to_value(&self) -> Value {
32         Value { inner: self.inner }
33     }
34 }
35 
36 /// A value in a structured key-value pair.
37 pub struct Value<'v> {
38     inner: Inner<'v>,
39 }
40 
41 impl<'v> Value<'v> {
42     /// Get a value from an internal primitive.
from_primitive<T>(value: T) -> Self where T: Into<Primitive<'v>>,43     fn from_primitive<T>(value: T) -> Self
44     where
45         T: Into<Primitive<'v>>,
46     {
47         Value {
48             inner: Inner::Primitive(value.into()),
49         }
50     }
51 
52     /// Visit the value using an internal visitor.
visit<'a>(&'a self, visitor: &mut dyn Visitor<'a>) -> Result<(), Error>53     fn visit<'a>(&'a self, visitor: &mut dyn Visitor<'a>) -> Result<(), Error> {
54         self.inner.visit(visitor)
55     }
56 }
57