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