cgp_field/traits/
has_field_mut.rs

1use core::marker::PhantomData;
2use core::ops::DerefMut;
3
4use crate::traits::{FieldGetter, HasField};
5
6#[diagnostic::on_unimplemented(
7    message = "HasFieldMut is not implemented for {Self} with the field: {Tag}",
8    note = "You need to add #[derive(HasField)] to {Self} with the given field present in the struct"
9)]
10pub trait HasFieldMut<Tag>: HasField<Tag> {
11    fn get_field_mut(&mut self, tag: PhantomData<Tag>) -> &mut Self::Value;
12}
13
14pub trait MutFieldGetter<Context, Tag>: FieldGetter<Context, Tag> {
15    fn get_field_mut(context: &mut Context, tag: PhantomData<Tag>) -> &mut Self::Value;
16}
17
18#[diagnostic::do_not_recommend]
19impl<Context, Tag, Target, Value> HasFieldMut<Tag> for Context
20where
21    Context: DerefMut<Target = Target>,
22    Target: HasFieldMut<Tag, Value = Value> + 'static,
23{
24    fn get_field_mut(&mut self, tag: PhantomData<Tag>) -> &mut Self::Value {
25        self.deref_mut().get_field_mut(tag)
26    }
27}