| #![warn( |
| missing_debug_implementations, |
| missing_docs, |
| rust_2018_idioms, |
| unreachable_pub |
| )] |
| //! Valuable provides object-safe value inspection. Use cases include passing |
| //! structured data to trait objects and object-safe serialization. |
| //! |
| //! # Getting started |
| //! |
| //! First, derive [`Valuable`][macro@crate::Valuable] on your types. |
| //! |
| //! ``` |
| //! use valuable::Valuable; |
| //! |
| //! #[derive(Valuable)] |
| //! struct HelloWorld { |
| //! message: Message, |
| //! } |
| //! |
| //! #[derive(Valuable)] |
| //! enum Message { |
| //! HelloWorld, |
| //! Custom(String), |
| //! } |
| //! ``` |
| //! |
| //! Then, implement a [visitor][Visit] to inspect the data. |
| //! |
| //! ``` |
| //! use valuable::{NamedValues, Value, Valuable, Visit}; |
| //! |
| //! struct Print; |
| //! |
| //! impl Visit for Print { |
| //! fn visit_value(&mut self, value: Value<'_>) { |
| //! match value { |
| //! Value::Structable(v) => { |
| //! println!("struct {}", v.definition().name()); |
| //! v.visit(self); |
| //! } |
| //! Value::Enumerable(v) => { |
| //! println!("enum {}::{}", v.definition().name(), v.variant().name()); |
| //! v.visit(self); |
| //! } |
| //! Value::Listable(v) => { |
| //! println!("list"); |
| //! v.visit(self); |
| //! } |
| //! Value::Mappable(v) => { |
| //! println!("map"); |
| //! v.visit(self); |
| //! } |
| //! _ => { |
| //! println!("value {:?}", value); |
| //! } |
| //! } |
| //! } |
| //! |
| //! fn visit_named_fields(&mut self, named_fields: &NamedValues<'_>) { |
| //! for (field, value) in named_fields.iter() { |
| //! println!("named field {}", field.name()); |
| //! value.visit(self); |
| //! } |
| //! } |
| //! |
| //! fn visit_unnamed_fields(&mut self, values: &[Value<'_>]) { |
| //! for value in values { |
| //! value.visit(self); |
| //! } |
| //! } |
| //! |
| //! fn visit_entry(&mut self, key: Value<'_>, value: Value<'_>) { |
| //! println!("key / value"); |
| //! key.visit(self); |
| //! value.visit(self); |
| //! } |
| //! } |
| //! ``` |
| //! |
| //! Then, use the visitor to visit the value. |
| //! |
| //! ``` |
| //! # use valuable::*; |
| //! # #[derive(Valuable)] |
| //! # struct HelloWorld { message: Message } |
| //! # #[derive(Valuable)] |
| //! # enum Message { HelloWorld } |
| //! # struct Print; |
| //! # impl Visit for Print { |
| //! # fn visit_value(&mut self, _: Value<'_>) {} |
| //! # } |
| //! let hello_world = HelloWorld { message: Message::HelloWorld }; |
| //! hello_world.visit(&mut Print); |
| //! ``` |
| |
| #![cfg_attr(not(feature = "std"), no_std)] |
| #![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg, doc_cfg_hide))] |
| #![cfg_attr( |
| docsrs, |
| doc(cfg_hide( |
| not(valuable_no_atomic_cas), |
| not(valuable_no_atomic), |
| not(valuable_no_atomic_64) |
| )) |
| )] |
| |
| #[cfg(feature = "alloc")] |
| extern crate alloc; |
| |
| mod enumerable; |
| pub use enumerable::{EnumDef, Enumerable, Variant, VariantDef}; |
| |
| mod field; |
| pub use field::{Fields, NamedField}; |
| |
| mod listable; |
| pub use listable::Listable; |
| |
| mod mappable; |
| pub use mappable::Mappable; |
| |
| mod named_values; |
| pub use named_values::NamedValues; |
| |
| mod slice; |
| pub use slice::Slice; |
| |
| mod structable; |
| pub use structable::{StructDef, Structable}; |
| |
| mod tuplable; |
| pub use tuplable::{Tuplable, TupleDef}; |
| |
| mod valuable; |
| pub use crate::valuable::Valuable; |
| |
| mod value; |
| pub use value::Value; |
| |
| mod visit; |
| pub use visit::{visit, Visit}; |
| |
| #[cfg(feature = "derive")] |
| pub use valuable_derive::Valuable; |