Trait specs::saveload::ConvertSaveload
source · [−]pub trait ConvertSaveload<M>: Sized {
type Data: Serialize + DeserializeOwned;
type Error;
fn convert_from<F>(data: Self::Data, ids: F) -> Result<Self, Self::Error>
where
F: FnMut(M) -> Option<Entity>;
fn convert_into<F>(&self, ids: F) -> Result<Self::Data, Self::Error>
where
F: FnMut(Entity) -> Option<M>;
}Expand description
Converts a data type (usually a Component) into its serializable form
and back to actual data from it’s deserialized form.
This is automatically implemented for any type that is
Clone, Serialize and DeserializeOwned.
Implementing this yourself is usually only needed if you
have a component that points to another Entity, or has a field which
does, and you wish to Serialize it.
Note: if you’re using specs_derive
you can use #[derive(Saveload)] to automatically derive this.
You must add the derive to any type that your component holds which does
not auto-implement this traits, including the component itself (similar to
how normal Serialize and Deserialize work).
Example
use serde::{Deserialize, Serialize};
use specs::{
prelude::*,
saveload::{ConvertSaveload, Marker},
};
use std::convert::Infallible;
struct Target(Entity);
impl Component for Target {
type Storage = VecStorage<Self>;
}
// We need a matching "data" struct to hold our
// marker. In general, you just need a single struct
// per component you want to make `Serialize`/`Deserialize` with each
// instance of `Entity` replaced with a generic "M".
#[derive(Serialize, Deserialize)]
struct TargetData<M>(M);
impl<M: Marker + Serialize> ConvertSaveload<M> for Target
where
for<'de> M: Deserialize<'de>,
{
type Data = TargetData<M>;
type Error = Infallible;
fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error>
where
F: FnMut(Entity) -> Option<M>,
{
let marker = ids(self.0).unwrap();
Ok(TargetData(marker))
}
fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error>
where
F: FnMut(M) -> Option<Entity>,
{
let entity = ids(data.0).unwrap();
Ok(Target(entity))
}
}Required Associated Types
type Data: Serialize + DeserializeOwned
type Data: Serialize + DeserializeOwned
(De)Serializable data representation for data type
Required Methods
Convert this data from a deserializable form (Data) using
entity to marker mapping function