naia_shared/world/component/
property_mutate.rs1use std::ops::{Deref, DerefMut};
2
3pub trait PropertyMutate: PropertyMutateClone + Send + Sync + 'static {
6 fn mutate(&mut self, property_index: u8) -> bool;
9}
10
11pub trait PropertyMutateClone {
13 fn clone_box(&self) -> Box<dyn PropertyMutate>;
15}
16
17impl<T: 'static + Clone + PropertyMutate> PropertyMutateClone for T {
18 fn clone_box(&self) -> Box<dyn PropertyMutate> {
19 Box::new(self.clone())
20 }
21}
22
23impl Clone for Box<dyn PropertyMutate> {
24 fn clone(&self) -> Box<dyn PropertyMutate> {
25 PropertyMutateClone::clone_box(self.as_ref())
26 }
27}
28
29#[derive(Clone)]
31pub struct PropertyMutator {
32 inner: Box<dyn PropertyMutate>,
33}
34
35impl PropertyMutator {
36 pub fn new<M: PropertyMutate>(mutator: M) -> Self {
38 let inner = Box::new(mutator);
39 Self { inner }
40 }
41
42 pub fn clone_new(&self) -> Self {
44 let new_inner = self.inner.as_ref().clone_box();
47
48 Self { inner: new_inner }
49 }
50}
51
52impl Deref for PropertyMutator {
53 type Target = dyn PropertyMutate;
54
55 fn deref(&self) -> &Self::Target {
56 self.inner.deref()
57 }
58}
59
60impl DerefMut for PropertyMutator {
61 fn deref_mut(&mut self) -> &mut Self::Target {
62 self.inner.deref_mut()
63 }
64}