Module base::descriptor_reflection
source · Expand description
Provides infrastructure for de/serializing descriptors embedded in Rust data structures.
§Example
use serde_json::to_string;
use base::{
FileSerdeWrapper, FromRawDescriptor, SafeDescriptor, SerializeDescriptors,
deserialize_with_descriptors,
};
use tempfile::tempfile;
let tmp_f = tempfile().unwrap();
// Uses a simple wrapper to serialize a File because we can't implement Serialize for File.
let data = FileSerdeWrapper(tmp_f);
// Wraps Serialize types to collect side channel descriptors as Serialize is called.
let data_wrapper = SerializeDescriptors::new(&data);
// Use the wrapper with any serializer to serialize data is normal, grabbing descriptors
// as the data structures are serialized by the serializer.
let out_json = serde_json::to_string(&data_wrapper).expect("failed to serialize");
// If data_wrapper contains any side channel descriptor refs
// (it contains tmp_f in this case), we can retrieve the actual descriptors
// from the side channel using into_descriptors().
let out_descriptors = data_wrapper.into_descriptors();
// When sending out_json over some transport, also send out_descriptors.
// For this example, we aren't really transporting data across the process, but we do need to
// convert the descriptor type.
let mut safe_descriptors = out_descriptors
.iter()
.map(|&v| unsafe { SafeDescriptor::from_raw_descriptor(v) });
std::mem::forget(data); // Prevent double drop of tmp_f.
// The deserialize_with_descriptors function is used give the descriptor deserializers access
// to side channel descriptors.
let res: FileSerdeWrapper =
deserialize_with_descriptors(|| serde_json::from_str(&out_json), safe_descriptors)
.expect("failed to deserialize");
Modules§
- Module that exports
serialize
/deserialize
functions for use with#[serde(with = "...")]
attribute. - Module that exports
serialize
/deserialize
functions for use with#[serde(with = "...")]
attribute. It only works with fields withRawDescriptor
type.
Structs§
- A simple wrapper around
File
that implementsSerialize
/Deserialize
, which is useful when the#[serde(with = "with_as_descriptor")]
trait is infeasible, such as for a field with typeOption<File>
. - Wrapper for a
Serialize
value which will capture any descriptors exported by the value when given to an ordinarySerializer
.
Constants§
Functions§
- Deserializes a descriptor provided via
deserialize_with_descriptors
. - Allows the use of any serde deserializer within a closure while providing access to the a set of descriptors for use in
deserialize_descriptor
. - Initializes the thread local storage for descriptor serialization. Fails if it was already initialized without an intervening
take_descriptor_dst
on this thread. - Pushes a descriptor on the thread local destination of descriptors, returning the index in which the descriptor was pushed. Returns Err if the thread local destination was not already initialized.
- Serializes a descriptor for later retrieval in a parent
SerializeDescriptors
struct. - Sets the thread local storage of descriptors for deserialization. Fails if this was already called without a call to
take_descriptor_src
on this thread. - Takes a descriptor at the given index from the thread local source of descriptors. Returns None if the thread local source was not already initialized.
- Takes the thread local storage for descriptor serialization. Fails if there wasn’t a prior call to
init_descriptor_dst
on this thread. - Takes the thread local storage of descriptors for deserialization. Fails if the storage was already taken or never set with
set_descriptor_src
.