pub struct WithSchemaContext { /* private fields */ }Expand description
Context object used to keep track of recursion.
Datastructures which cannot contain recursion do not need to concern themselves with this. Recursive data structures in rust require the use of Box, Vec, Arc, or similar. The most common of these datatypes from std are supported by savefile, and will guard against recursion in a well-defined way. As a user of Savefile, you only need to use this if you are implementing Savefile for container or smart-pointer type.
Implementations§
Source§impl WithSchemaContext
impl WithSchemaContext
Sourcepub fn new() -> WithSchemaContext
pub fn new() -> WithSchemaContext
Create a new empty WithSchemaContext. This is useful for calling ::schema at the top-level.
Source§impl WithSchemaContext
impl WithSchemaContext
Sourcepub fn possible_recursion<T: WithSchema>(
&mut self,
cb: impl FnOnce(&mut WithSchemaContext) -> Schema,
) -> Schema
pub fn possible_recursion<T: WithSchema>( &mut self, cb: impl FnOnce(&mut WithSchemaContext) -> Schema, ) -> Schema
Use this when returning the schema of a type that can be part of a recursion. For example, given a hypothetical user-implemented type MyBox, do
use savefile::{Schema, WithSchema, WithSchemaContext};
#[repr(transparent)]
struct MyBox<T> {
content: *const T
}
impl<T:WithSchema> WithSchema for MyBox<T> {
fn schema(version: u32, context: &mut WithSchemaContext) -> Schema {
context.possible_recursion::<MyBox<T>>(|context| Schema::Boxed(Box::new(T::schema(version, context))))
}
}If recursion is detected (traversing to exactly MyBox<T> twice, in the above example), the method
‘possible_recursion’ will return Schema::Recursion, stopping the Schema instance from becoming infinitely big.