async_ecs/access/
write.rs1use 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
10pub type WriteExpect<'a, T> = Write<'a, T, PanicHandler>;
14
15pub 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}