async_ecs/access/
write.rs

1use std::marker::PhantomData;
2use std::ops::{Deref, DerefMut};
3
4use crate::{
5    resource::{RefMut, Resource, ResourceId},
6    system::SystemData,
7    world::{DefaultSetupHandler, PanicHandler, SetupHandler, World},
8};
9
10/// Allows to fetch a resource in a system mutably.
11/// **This will panic if the resource does not exist.**
12/// Usage of `Write` or `Option<Write>` is therefore recommended.
13pub type WriteExpect<'a, T> = Write<'a, T, PanicHandler>;
14
15/// Allows to fetch a resource in a system mutably.
16///
17/// If the resource isn't strictly required, you should use `Option<Write<T>>`.
18///
19/// # Type parameters
20///
21/// * `T`: The type of the resource
22/// * `F`: The setup handler (default: `DefaultProvider`)
23pub struct Write<'a, T: 'a, F = DefaultSetupHandler> {
24    inner: RefMut<'a, T>,
25    marker: PhantomData<F>,
26}
27
28impl<'a, T, F> Write<'a, T, F> {
29    pub fn new(inner: RefMut<'a, T>) -> Self {
30        Self {
31            inner,
32            marker: PhantomData,
33        }
34    }
35}
36
37impl<'a, T, F> Deref for Write<'a, T, F>
38where
39    T: Resource,
40{
41    type Target = T;
42
43    fn deref(&self) -> &T {
44        &*self.inner
45    }
46}
47
48impl<'a, T, F> DerefMut for Write<'a, T, F>
49where
50    T: Resource,
51{
52    fn deref_mut(&mut self) -> &mut T {
53        &mut *self.inner
54    }
55}
56
57impl<'a, T, F> SystemData<'a> for Write<'a, T, F>
58where
59    T: Resource,
60    F: SetupHandler<T>,
61{
62    fn setup(world: &mut World) {
63        F::setup(world)
64    }
65
66    fn fetch(world: &'a World) -> Self {
67        Self::new(world.borrow_mut())
68    }
69
70    fn reads() -> Vec<ResourceId> {
71        vec![]
72    }
73
74    fn writes() -> Vec<ResourceId> {
75        vec![ResourceId::new::<T>()]
76    }
77}