pub struct LoadTransformAndSave<L: AssetLoader, T: AssetTransformer<AssetInput = L::Asset>, S: AssetSaver<Asset = T::AssetOutput>> { /* private fields */ }
Expand description
A flexible Process
implementation that loads the source Asset
using the L
AssetLoader
, then transforms
the L
asset into an S
AssetSaver
asset using the T
AssetTransformer
, and lastly saves the asset using the S
AssetSaver
.
When creating custom processors, it is generally recommended to use the LoadTransformAndSave
Process
implementation,
as it encourages you to separate your code into an AssetLoader
capable of loading assets without processing enabled,
an AssetTransformer
capable of converting from an L
asset to an S
asset, and
an AssetSaver
that allows you save any S
asset. However you can
also implement Process
directly if LoadTransformAndSave
feels limiting or unnecessary.
If your Process
does not need to transform the Asset
, you can use IdentityAssetTransformer
as T
.
This will directly return the input Asset
, allowing your Process
to directly load and then save an Asset
.
However, this pattern should only be used for cases such as file format conversion.
Otherwise, consider refactoring your AssetLoader
and AssetSaver
to isolate the transformation step into an explicit AssetTransformer
.
This uses LoadTransformAndSaveSettings
to configure the processor.
Implementations§
source§impl<L: AssetLoader, T: AssetTransformer<AssetInput = L::Asset>, S: AssetSaver<Asset = T::AssetOutput>> LoadTransformAndSave<L, T, S>
impl<L: AssetLoader, T: AssetTransformer<AssetInput = L::Asset>, S: AssetSaver<Asset = T::AssetOutput>> LoadTransformAndSave<L, T, S>
Trait Implementations§
source§impl<L: AssetLoader, S: AssetSaver<Asset = L::Asset>> From<S> for LoadTransformAndSave<L, IdentityAssetTransformer<L::Asset>, S>
impl<L: AssetLoader, S: AssetSaver<Asset = L::Asset>> From<S> for LoadTransformAndSave<L, IdentityAssetTransformer<L::Asset>, S>
source§impl<Loader, Transformer, Saver> Process for LoadTransformAndSave<Loader, Transformer, Saver>where
Loader: AssetLoader,
Transformer: AssetTransformer<AssetInput = Loader::Asset>,
Saver: AssetSaver<Asset = Transformer::AssetOutput>,
impl<Loader, Transformer, Saver> Process for LoadTransformAndSave<Loader, Transformer, Saver>where
Loader: AssetLoader,
Transformer: AssetTransformer<AssetInput = Loader::Asset>,
Saver: AssetSaver<Asset = Transformer::AssetOutput>,
source§type Settings = LoadTransformAndSaveSettings<<Loader as AssetLoader>::Settings, <Transformer as AssetTransformer>::Settings, <Saver as AssetSaver>::Settings>
type Settings = LoadTransformAndSaveSettings<<Loader as AssetLoader>::Settings, <Transformer as AssetTransformer>::Settings, <Saver as AssetSaver>::Settings>
AssetMeta
and is user-configurable per-asset.source§type OutputLoader = <Saver as AssetSaver>::OutputLoader
type OutputLoader = <Saver as AssetSaver>::OutputLoader
AssetLoader
that will be used to load the final processed asset.source§async fn process(
&self,
context: &mut ProcessContext<'_>,
meta: AssetMeta<(), Self>,
writer: &mut Writer,
) -> Result<<Self::OutputLoader as AssetLoader>::Settings, ProcessError>
async fn process( &self, context: &mut ProcessContext<'_>, meta: AssetMeta<(), Self>, writer: &mut Writer, ) -> Result<<Self::OutputLoader as AssetLoader>::Settings, ProcessError>
context
in some way using the settings stored on meta
. The results are written to writer
. The
final written processed asset is loadable using Process::OutputLoader
. This load will use the returned AssetLoader::Settings
.Auto Trait Implementations§
impl<L, T, S> Freeze for LoadTransformAndSave<L, T, S>
impl<L, T, S> RefUnwindSafe for LoadTransformAndSave<L, T, S>where
T: RefUnwindSafe,
S: RefUnwindSafe,
impl<L, T, S> Send for LoadTransformAndSave<L, T, S>
impl<L, T, S> Sync for LoadTransformAndSave<L, T, S>
impl<L, T, S> Unpin for LoadTransformAndSave<L, T, S>
impl<L, T, S> UnwindSafe for LoadTransformAndSave<L, T, S>where
T: UnwindSafe,
S: UnwindSafe,
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> DowncastSync for T
impl<T> DowncastSync for T
source§impl<P> ErasedProcessor for Pwhere
P: Process,
impl<P> ErasedProcessor for Pwhere
P: Process,
source§fn process<'a>(
&'a self,
context: &'a mut ProcessContext<'_>,
meta: Box<dyn AssetMetaDyn>,
writer: &'a mut (dyn AsyncWrite + Unpin + Sync + Send + 'static),
) -> Pin<Box<dyn ConditionalSendFuture<Output = Result<Box<dyn AssetMetaDyn>, ProcessError>> + 'a>>
fn process<'a>( &'a self, context: &'a mut ProcessContext<'_>, meta: Box<dyn AssetMetaDyn>, writer: &'a mut (dyn AsyncWrite + Unpin + Sync + Send + 'static), ) -> Pin<Box<dyn ConditionalSendFuture<Output = Result<Box<dyn AssetMetaDyn>, ProcessError>> + 'a>>
Process::process
.source§fn deserialize_meta(
&self,
meta: &[u8],
) -> Result<Box<dyn AssetMetaDyn>, DeserializeMetaError>
fn deserialize_meta( &self, meta: &[u8], ) -> Result<Box<dyn AssetMetaDyn>, DeserializeMetaError>
source§fn default_meta(&self) -> Box<dyn AssetMetaDyn>
fn default_meta(&self) -> Box<dyn AssetMetaDyn>
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 more