Skip to main content

Visitor

Struct Visitor 

Source
pub struct Visitor {
    pub blackboard: Blackboard,
    pub flags: VisitorFlags,
    /* private fields */
}
Expand description

Visitor is a tree-based serializer/deserializer with intermediate representation for stored data. When data is serialized, it will be transformed into an intermediate representation and only then will be dumped onto the disk. Deserialization is the same: the data (binary or text) is read and converted into an intermediate representation (IR). End users can use this IR to save or load their structures of pretty much any complexity.

§Overview

Visitor uses a tree to create structured data storage. Basic unit is a node - it is a container for data fields. Each node has a name, handle to parent, set of handles to children nodes and a container for data fields. Data field is a pair of a name and a value, the value can be any of simple Rust types and some of the trivially copyable data structures (vectors, matrices, etc.). The main criteria of what could be the field and what not is the ability to be represented as a set of bytes.

Instead of calling visitor methods to read or write the visitor’s data, reading and writing happen in the Visit::visit method of a variable that will either store the read value or holds the value to be written.

For example, x.visit("MyValue", &mut visitor) will do one of:

  1. Take the value of x and store it in visitor under the name “MyValue”, if visitor.is_reading() is false.
  2. Read a value named “MyValue” from visitor and store it in x, if visitor.is_reading() is true.

Whether the value of x gets written into visitor or overwritten with a value from visitor is determined by whether Visitor::is_reading() returns true or false.

Fields§

§blackboard: Blackboard

A place to store whatever objects may be needed to help with reading and writing values.

§flags: VisitorFlags

Flags that can activate special behavior in some Visit values, such as crate::variable::InheritableVariable.

Implementations§

Source§

impl Visitor

Source

pub const MAGIC_BINARY_CURRENT: &'static str = "FBAF"

Sequence of bytes that is automatically written at the start when a visitor is encoded into bytes. It is written by Visitor::save_binary_to_file, Visitor::save_binary_to_memory, and Visitor::save_binary_to_vec.

Visitor::load_binary_from_file will return an error if this sequence of bytes is not present at the beginning of the file, and Visitor::load_binary_from_memory will return an error of these bytes are not at the beginning of the given slice.

Source

pub const MAGIC_ASCII_CURRENT: &'static str = "FTAX"

Sequence of bytes that is automatically written at the start when a visitor is encoded into ascii form. It is written by Visitor::save_ascii_to_file, Visitor::save_ascii_to_memory, and Visitor::save_ascii_to_string.

Visitor::load_ascii_from_file will return an error if this sequence of bytes is not present at the beginning of the file, and Visitor::load_ascii_from_memory will return an error of these bytes are not at the beginning of the given slice.

Source

pub fn is_supported(src: &mut dyn Read) -> bool

Checks whether the given reader points to a supported file format or not.

Source

pub fn detect_format(src: &mut dyn Read) -> Format

Tries to extract the information about the file format in the given reader.

Source

pub fn detect_format_from_slice(data: &[u8]) -> Format

Tries to extract the information about the file format in the given slice.

Source

pub fn new() -> Visitor

Creates a Visitor containing only a single node called “__ROOT__” which will be the current region of the visitor.

Source

pub fn find_field(&mut self, name: &str) -> Option<&mut Field>

Tries to find a field by its name.

Source

pub fn find_node(&self, name: &str) -> Option<&VisitorNode>

Tries to find a node by its name.

Source

pub fn is_reading(&self) -> bool

True if this Visitor is changing the values that it visits. In other words, x.visit("MyValue", &mut visitor) will result in x being mutated to match whatever value is stored in visitor.

False if this visitor is copying and storing the values that it visits. In other words, x.visit("MyValue", &mut visitor) will result in x being unchanged, but visitor will be mutated to store the value of x under the name “MyValue”.

Source

pub fn version(&self) -> u32

Returns version number of the visitor.

Source

pub fn has_region(&self, name: &str) -> bool

Returns true of a region with the given name exists as a child of the current node. When reading, has_region returning true means that enter_region will succeed. When writing, has_region returning true means that enter_region will fail.

Source

pub fn enter_region( &mut self, name: &str, ) -> Result<RegionGuard<'_>, VisitError>

If Visitor::is_reading, find a node with the given name that is a child of the current node, and return a Visitor for the found node. Return an error if no node with that name exists.

If not reading, create a node with the given name as a chld of the current node, and return a visitor for the new node. Return an error if a node with that name already exists.

Source

pub fn breadcrumbs(&self) -> String

Return a string representing all the regions from the root to the current node.

Source

pub fn current_region(&self) -> Result<&str, PoolError>

The name of the current region. This should never be None if the Visitor is operating normally, because there should be no way to leave the initial __ROOT__ region.

Source

pub fn debug(&self) -> String

Get the content of the current node in human-readable form.

Source

pub fn debug_to<W>(&self, w: &mut W) -> Result<(), VisitError>
where W: Write,

Write the content of the current node in human-readable form.

Source

pub fn save_ascii_to_string(&self) -> String

Create a string containing all the data of this Visitor in ascii form. The string is formatted to be human-readable with each node on its own line and tabs to indent child nodes.

Source

pub fn save_ascii_to_file( &self, path: impl AsRef<Path>, ) -> Result<(), VisitError>

Create a string containing all the data of this Visitor in ascii form and saves it to the given path. The string is formatted to be human-readable with each node on its own line and tabs to indent child nodes.

Source

pub fn save_ascii_to_memory(&self, dest: impl Write) -> Result<(), VisitError>

Create a string containing all the data of this Visitor in ascii form and writes it to the given writer. The string is formatted to be human-readable with each node on its own line and tabs to indent child nodes.

Source

pub fn load_ascii_from_memory(data: &[u8]) -> Result<Visitor, VisitError>

Tries to create a visitor from the given data. The returned instance can then be used to deserialize some data.

Source

pub async fn load_ascii_from_file( path: impl AsRef<Path>, ) -> Result<Visitor, VisitError>

Tries to create a visitor from the given file. The returned instance can then be used to deserialize some data.

Source

pub fn save_binary_to_memory(&self, dest: impl Write) -> Result<(), VisitError>

Write the data of this Visitor to the given writer. Begin by writing Visitor::MAGIC_BINARY_CURRENT.

Source

pub fn save_binary_to_vec(&self) -> Result<Vec<u8>, VisitError>

Encode the data of this visitor into bytes and push the bytes into the given Vec<u8>. Begin by writing Visitor::MAGIC_BINARY_CURRENT.

Source

pub fn save_binary_to_file( &self, path: impl AsRef<Path>, ) -> Result<(), VisitError>

Create a file at the given path and write the data of this visitor into that file in a non-human-readable binary format so that the data can be reconstructed using Visitor::load_binary_from_file. Begin by writing Visitor::MAGIC_BINARY_CURRENT.

Source

pub async fn load_binary_from_file( path: impl AsRef<Path>, ) -> Result<Visitor, VisitError>

Create a visitor by reading data from the file at the given path, assuming that the file was created using Visitor::save_binary_to_file. Return a VisitError::NotSupportedFormat if Visitor::MAGIC_BINARY_CURRENT is not the first bytes read from the file.

Source

pub fn load_binary_from_memory(data: &[u8]) -> Result<Visitor, VisitError>

Create a visitor by decoding data from the given byte slice, assuming that the bytes are in the format that would be produced by Visitor::save_binary_to_vec. Return a VisitError::NotSupportedFormat if Visitor::MAGIC_BINARY_CURRENT is not the first bytes read from the slice.

Source

pub async fn load_from_file( path: impl AsRef<Path>, ) -> Result<Visitor, VisitError>

Tries to load a visitor from the given file. This method automatically detects a format of the incoming data (binary or ASCII) and tries to load it.

Source

pub fn load_from_memory(data: &[u8]) -> Result<Visitor, VisitError>

Tries to load a visitor from the given data. This method automatically detects a format of the incoming data (binary or ASCII) and tries to load it.

Trait Implementations§

Source§

impl Debug for Visitor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for Visitor

Source§

fn default() -> Visitor

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Visitor

§

impl !RefUnwindSafe for Visitor

§

impl !Send for Visitor

§

impl !Sync for Visitor

§

impl Unpin for Visitor

§

impl !UnwindSafe for Visitor

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<T, U> ObjectOrVariant<T> for U

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more