pub struct Visitor {
pub blackboard: Blackboard,
pub flags: VisitorFlags,
/* private fields */
}
Expand description
A collection of nodes that stores data that can be read or write values of types with the Visit trait.
Instead of calling methods of the visitor in order to read or write the visitor’s data, reading and writing happens 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:
- Take the value of
x
and store it invisitor
under the name “MyValue”, ifvisitor.is_reading()
is false. - Read a value named “MyValue” from
visitor
and store it inx
, ifvisitor.is_reading()
is true.
Whether the value of x
gets written into visitor
or overwitten 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 assist with reading and writing values.
flags: VisitorFlags
Flags that can activate special behaviour in some Visit values, such as crate::variable::InheritableVariable.
Implementations§
Source§impl Visitor
impl Visitor
Sourcepub const MAGIC: &'static str = "RG3D"
pub const MAGIC: &'static str = "RG3D"
Sequence of bytes that is automatically written at the start when a visitor is encoded into bytes. It is written by Visitor::save_binary, Visitor::save_binary_to_memory, and Visitor::save_binary_to_vec.
Visitor::load_binary will return an error if this sequence of bytes is not present at the beginning of the file, and Visitor::load_from_memory will return an error of these bytes are not at the beginning of the given slice.
Sourcepub fn new() -> Visitor
pub fn new() -> Visitor
Creates a Visitor containing only a single node called “__ROOT__
” which will be the
current region of the visitor.
Sourcepub fn is_reading(&self) -> bool
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”.
Sourcepub fn enter_region(
&mut self,
name: &str,
) -> Result<RegionGuard<'_>, VisitError>
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.
Sourcepub fn current_region(&self) -> Option<&str>
pub fn current_region(&self) -> Option<&str>
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.
Sourcepub fn save_text(&self) -> String
pub fn save_text(&self) -> String
Create a String containing all the data of this Visitor. The String is formatted to be human-readable with each node on its own line and tabs to indent child nodes.
Sourcepub fn save_binary_to_memory<W>(&self, writer: W) -> Result<(), VisitError>where
W: Write,
pub fn save_binary_to_memory<W>(&self, writer: W) -> Result<(), VisitError>where
W: Write,
Write the data of this Visitor to the given writer. Begin by writing Visitor::MAGIC.
Sourcepub fn save_binary_to_vec(&self) -> Result<Vec<u8>, VisitError>
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.
Sourcepub fn save_binary<P>(&self, path: P) -> Result<(), VisitError>
pub fn save_binary<P>(&self, path: P) -> 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. Begin by writing Visitor::MAGIC.
Sourcepub async fn load_binary<P>(path: P) -> Result<Visitor, VisitError>
pub async fn load_binary<P>(path: P) -> 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. Return a VisitError::NotSupportedFormat if Visitor::MAGIC is not the first bytes read from the file.
Sourcepub fn load_from_memory(data: &[u8]) -> Result<Visitor, VisitError>
pub fn load_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 is not the first bytes read from the slice.
Trait Implementations§
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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 Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Any
. Could be used to downcast a trait object
to a particular type.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Any
. Could be used to downcast a trait object
to a particular type.fn into_any(self: Box<T>) -> Box<dyn Any>
Source§impl<T> FieldValue for Twhere
T: 'static,
impl<T> FieldValue for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian()
.Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.