pub enum ResourceState {
Unloaded,
Pending {
wakers: WakersList,
},
LoadError {
path: PathBuf,
error: LoadError,
},
Ok {
data: ResourceDataWrapper,
},
}Expand description
Resource could be in three possible states (a small state machine):
- Pending - it is loading or queued for loading.
- LoadError - an error has occurred during the load.
- Ok - resource is fully loaded and ready to use.
§Why is it so complex?
Short answer: asynchronous loading. Long answer: when you’re loading a scene, you expect it to be loaded as fast as possible, use all available power of the CPU. To achieve that, each resource ideally should be loaded on separate core of the CPU, but since this is asynchronous, we must be able to track the state of the resource.
§Path
Resources do not store their paths to respective files in the file system, instead resource only
stores their unique identifiers (UUID). Use crate::registry::ResourceRegistry to get a path
associated with the resource uuid.
§UUID
Resource UUID is available only if the resource is fully loaded. This is because there’s no way to get the UUID earlier: the UUID is stored in a metadata file which exists only if the resource is present. It is somewhat possible to get a UUID when a resource is failed to load, but not in 100% cases.
Variants§
Unloaded
Resource is not loaded. In some situations, having a handle to a resource can be sufficient even without the resource’s data.
Pending
Resource is loading from external resource or in the queue to load.
Fields
wakers: WakersListList of wakers to wake future when resource is fully loaded.
LoadError
An error has occurred during the load.
Fields
Ok
Actual resource data when it is fully loaded.
Fields
data: ResourceDataWrapperActual data of the resource.
Implementations§
Source§impl ResourceState
impl ResourceState
pub const PENDING_WAKERS: &'static str = "Pending@wakers"
pub const LOAD_ERROR_PATH: &'static str = "LoadError@path"
pub const LOAD_ERROR_ERROR: &'static str = "LoadError@error"
pub const OK_DATA: &'static str = "Ok@data"
Source§impl ResourceState
impl ResourceState
Sourcepub fn new_pending() -> ResourceState
pub fn new_pending() -> ResourceState
Creates new resource in pending state.
Sourcepub fn new_load_error(path: PathBuf, error: LoadError) -> ResourceState
pub fn new_load_error(path: PathBuf, error: LoadError) -> ResourceState
Creates new resource in error state.
Sourcepub fn new_ok<T>(data: T) -> ResourceStatewhere
T: ResourceData,
pub fn new_ok<T>(data: T) -> ResourceStatewhere
T: ResourceData,
Creates new resource in ResourceState::Ok state.
Sourcepub fn new_ok_untyped(data: Box<dyn ResourceData>) -> ResourceState
pub fn new_ok_untyped(data: Box<dyn ResourceData>) -> ResourceState
Creates a new resource in ResourceState::Ok state using arbitrary data.
Sourcepub fn is_loading(&self) -> bool
pub fn is_loading(&self) -> bool
Checks whether the resource is still loading or not.
Sourcepub fn switch_to_pending_state(&mut self)
pub fn switch_to_pending_state(&mut self)
Switches the internal state of the resource to ResourceState::Pending.
Sourcepub fn commit(&mut self, state: ResourceState)
pub fn commit(&mut self, state: ResourceState)
Changes ResourceState::Pending state to ResourceState::Ok(data) with given data.
Additionally it wakes all futures.
Sourcepub fn commit_ok<T>(&mut self, data: T)where
T: ResourceData,
pub fn commit_ok<T>(&mut self, data: T)where
T: ResourceData,
Changes internal state to ResourceState::Ok
Sourcepub fn commit_error<E>(&mut self, path: PathBuf, error: E)where
E: ResourceLoadError,
pub fn commit_error<E>(&mut self, path: PathBuf, error: E)where
E: ResourceLoadError,
Changes internal state to ResourceState::LoadError.
Sourcepub fn data_ref(&self) -> Option<&ResourceDataWrapper>
pub fn data_ref(&self) -> Option<&ResourceDataWrapper>
Tries to get the resource data. Will fail if the resource is not in ResourceState::Ok.
Sourcepub fn data_mut(&mut self) -> Option<&mut ResourceDataWrapper>
pub fn data_mut(&mut self) -> Option<&mut ResourceDataWrapper>
Tries to get the resource data. Will fail if the resource is not in ResourceState::Ok.
Sourcepub fn data_ref_of_type<T>(&self) -> Option<&T>where
T: TypedResourceData,
pub fn data_ref_of_type<T>(&self) -> Option<&T>where
T: TypedResourceData,
Tries to get the resource data of the given type. Will fail if the resource is not in
ResourceState::Ok.
Sourcepub fn data_mut_of_type<T>(&mut self) -> Option<&mut T>where
T: TypedResourceData,
pub fn data_mut_of_type<T>(&mut self) -> Option<&mut T>where
T: TypedResourceData,
Tries to get the resource data of the given type. Will fail if the resource is not in
ResourceState::Ok.
Trait Implementations§
Source§impl Clone for ResourceState
impl Clone for ResourceState
Source§fn clone(&self) -> ResourceState
fn clone(&self) -> ResourceState
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ResourceState
impl Debug for ResourceState
Source§impl Default for ResourceState
impl Default for ResourceState
Source§fn default() -> ResourceState
fn default() -> ResourceState
Source§impl Display for ResourceState
impl Display for ResourceState
Source§impl Drop for ResourceState
impl Drop for ResourceState
Source§impl Reflect for ResourceStatewhere
ResourceState: 'static,
impl Reflect for ResourceStatewhere
ResourceState: 'static,
fn source_path() -> &'static str
fn try_clone_box(&self) -> Option<Box<dyn Reflect>>
fn type_name(&self) -> &'static str
fn derived_types() -> &'static [TypeId]
fn query_derived_types(&self) -> &'static [TypeId]
fn doc(&self) -> &'static str
Source§fn assembly_name(&self) -> &'static str
fn assembly_name(&self) -> &'static str
#[derive(Reflect)]) to ensure that this method will return correct assembly
name. In other words - there’s no guarantee, that any implementation other than proc-macro
will return a correct name of the assembly. Alternatively, you can use env!("CARGO_PKG_NAME")
as an implementation.Source§fn type_assembly_name() -> &'static str
fn type_assembly_name() -> &'static str
#[derive(Reflect)]) to ensure that this method will return correct assembly
name. In other words - there’s no guarantee, that any implementation other than proc-macro
will return a correct name of the assembly. Alternatively, you can use env!("CARGO_PKG_NAME")
as an implementation.fn fields_ref(&self, func: &mut dyn FnMut(&[FieldRef<'_, '_>]))
fn fields_mut(&mut self, func: &mut dyn FnMut(&mut [FieldMut<'_, '_>]))
fn into_any(self: Box<ResourceState>) -> Box<dyn Any>
fn set( &mut self, value: Box<dyn Reflect>, ) -> Result<Box<dyn Reflect>, Box<dyn Reflect>>
fn as_any(&self, func: &mut dyn FnMut(&(dyn Any + 'static)))
fn as_any_mut(&mut self, func: &mut dyn FnMut(&mut (dyn Any + 'static)))
fn as_reflect(&self, func: &mut dyn FnMut(&(dyn Reflect + 'static)))
fn as_reflect_mut(&mut self, func: &mut dyn FnMut(&mut (dyn Reflect + 'static)))
Source§fn set_field(
&mut self,
field_name: &str,
value: Box<dyn Reflect>,
func: &mut dyn FnMut(Result<Box<dyn Reflect>, SetFieldError>),
)
fn set_field( &mut self, field_name: &str, value: Box<dyn Reflect>, func: &mut dyn FnMut(Result<Box<dyn Reflect>, SetFieldError>), )
#[reflect(setter = ..)] or falls back to
Reflect::field_mutfn field( &self, name: &str, func: &mut dyn FnMut(Option<&(dyn Reflect + 'static)>), )
fn field_mut( &mut self, name: &str, func: &mut dyn FnMut(Option<&mut (dyn Reflect + 'static)>), )
fn as_array(&self, func: &mut dyn FnMut(Option<&(dyn ReflectArray + 'static)>))
fn as_array_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectArray + 'static)>), )
fn as_list(&self, func: &mut dyn FnMut(Option<&(dyn ReflectList + 'static)>))
fn as_list_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectList + 'static)>), )
fn as_inheritable_variable( &self, func: &mut dyn FnMut(Option<&(dyn ReflectInheritableVariable + 'static)>), )
fn as_inheritable_variable_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectInheritableVariable + 'static)>), )
fn as_hash_map( &self, func: &mut dyn FnMut(Option<&(dyn ReflectHashMap + 'static)>), )
fn as_hash_map_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectHashMap + 'static)>), )
fn as_handle( &self, func: &mut dyn FnMut(Option<&(dyn ReflectHandle + 'static)>), )
fn as_handle_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectHandle + 'static)>), )
Auto Trait Implementations§
impl Freeze for ResourceState
impl !RefUnwindSafe for ResourceState
impl Send for ResourceState
impl !Sync for ResourceState
impl Unpin for ResourceState
impl !UnwindSafe for ResourceState
Blanket Implementations§
Source§impl<T> AsyncTaskResult for T
impl<T> AsyncTaskResult for T
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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 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>, which can then be
downcast into Box<dyn 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>, which 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> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> FieldValue for Twhere
T: Reflect,
impl<T> FieldValue for Twhere
T: Reflect,
Source§fn field_value_as_any_ref(&self) -> &(dyn Any + 'static)
fn field_value_as_any_ref(&self) -> &(dyn Any + 'static)
self to a &dyn AnySource§fn field_value_as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn field_value_as_any_mut(&mut self) -> &mut (dyn Any + 'static)
self to a &mut dyn Anyfn field_value_as_reflect(&self) -> &(dyn Reflect + 'static)
fn field_value_as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
fn type_name(&self) -> &'static str
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<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
Source§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<T> ReflectBase for Twhere
T: Reflect,
impl<T> ReflectBase for Twhere
T: Reflect,
fn as_any_raw(&self) -> &(dyn Any + 'static)
fn as_any_raw_mut(&mut self) -> &mut (dyn Any + 'static)
Source§impl<T> ResolvePath for Twhere
T: Reflect,
impl<T> ResolvePath for Twhere
T: Reflect,
fn resolve_path<'p>( &self, path: &'p str, func: &mut dyn FnMut(Result<&(dyn Reflect + 'static), ReflectPathError<'p>>), )
fn resolve_path_mut<'p>( &mut self, path: &'p str, func: &mut dyn FnMut(Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>), )
fn get_resolve_path<'p, T>(
&self,
path: &'p str,
func: &mut dyn FnMut(Result<&T, ReflectPathError<'p>>),
)where
T: Reflect,
fn get_resolve_path_mut<'p, T>(
&mut self,
path: &'p str,
func: &mut dyn FnMut(Result<&mut T, ReflectPathError<'p>>),
)where
T: Reflect,
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.