WithSchemaContext

Struct WithSchemaContext 

Source
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

Source

pub fn new() -> WithSchemaContext

Create a new empty WithSchemaContext. This is useful for calling ::schema at the top-level.

Source§

impl WithSchemaContext

Source

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.

Auto Trait Implementations§

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, 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.