Skip to content

Commit 2d823e2

Browse files
committed
Remove blanket implementation of HasField
1 parent 3b8befa commit 2d823e2

File tree

3 files changed

+29
-31
lines changed

3 files changed

+29
-31
lines changed

crates/cgp-field/src/traits/has_field.rs

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use core::marker::PhantomData;
2-
use core::ops::Deref;
32

43
use cgp_component::UseContext;
54

@@ -59,19 +58,6 @@ pub trait FieldGetter<Context, Tag> {
5958
fn get_field(context: &Context, _tag: PhantomData<Tag>) -> &Self::Value;
6059
}
6160

62-
#[diagnostic::do_not_recommend]
63-
impl<Context, Tag, Target, Value> HasField<Tag> for Context
64-
where
65-
Context: DerefMap<Target = Target>,
66-
Target: HasField<Tag, Value = Value>,
67-
{
68-
type Value = Value;
69-
70-
fn get_field(&self, tag: PhantomData<Tag>) -> &Self::Value {
71-
self.map_deref(|context| context.get_field(tag))
72-
}
73-
}
74-
7561
impl<Context, Tag, Field> FieldGetter<Context, Tag> for UseContext
7662
where
7763
Context: HasField<Tag, Value = Field>,
@@ -83,20 +69,24 @@ where
8369
}
8470
}
8571

86-
/**
87-
A helper trait to help organize the lifetime inference in Rust.
88-
Without this, `Self::Target` would need to be `'static`, as Rust couldn't
89-
infer the correct lifetime when calling `context.deref().get_field()`.
90-
*/
91-
trait DerefMap: Deref {
92-
fn map_deref<T>(&self, mapper: impl for<'a> FnOnce(&'a Self::Target) -> &'a T) -> &T;
72+
impl<'a, Context, Tag, Value> HasField<Tag> for &'a Context
73+
where
74+
Context: HasField<Tag, Value = Value>,
75+
{
76+
type Value = Value;
77+
78+
fn get_field(&self, tag: PhantomData<Tag>) -> &Self::Value {
79+
Context::get_field(self, tag)
80+
}
9381
}
9482

95-
impl<Context> DerefMap for Context
83+
impl<'a, Context, Tag, Value> HasField<Tag> for &'a mut Context
9684
where
97-
Context: Deref,
85+
Context: HasField<Tag, Value = Value>,
9886
{
99-
fn map_deref<T>(&self, mapper: impl for<'a> FnOnce(&'a Self::Target) -> &'a T) -> &T {
100-
mapper(self.deref())
87+
type Value = Value;
88+
89+
fn get_field(&self, tag: PhantomData<Tag>) -> &Self::Value {
90+
Context::get_field(self, tag)
10191
}
10292
}

crates/cgp-field/src/traits/has_field_mut.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use core::marker::PhantomData;
2-
use core::ops::DerefMut;
32

43
use crate::traits::{FieldGetter, HasField};
54

@@ -15,13 +14,11 @@ pub trait MutFieldGetter<Context, Tag>: FieldGetter<Context, Tag> {
1514
fn get_field_mut(context: &mut Context, tag: PhantomData<Tag>) -> &mut Self::Value;
1615
}
1716

18-
#[diagnostic::do_not_recommend]
19-
impl<Context, Tag, Target, Value> HasFieldMut<Tag> for Context
17+
impl<'a, Context, Tag, Value> HasFieldMut<Tag> for &'a mut Context
2018
where
21-
Context: DerefMut<Target = Target>,
22-
Target: HasFieldMut<Tag, Value = Value> + 'static,
19+
Context: HasFieldMut<Tag, Value = Value>,
2320
{
2421
fn get_field_mut(&mut self, tag: PhantomData<Tag>) -> &mut Self::Value {
25-
self.deref_mut().get_field_mut(tag)
22+
Context::get_field_mut(self, tag)
2623
}
2724
}

crates/cgp-tests/src/tests/has_field/chain.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ fn test_chained_getter_with_outer_life() {
3939
pub name: String,
4040
}
4141

42+
impl<'a, Tag, Value> HasField<Tag> for Outer<'a>
43+
where
44+
Inner: HasField<Tag, Value = Value>,
45+
{
46+
type Value = Value;
47+
48+
fn get_field(&self, tag: PhantomData<Tag>) -> &Self::Value {
49+
self.inner.get_field(tag)
50+
}
51+
}
52+
4253
let context = Outer {
4354
inner: &Inner {
4455
name: "test".to_owned(),

0 commit comments

Comments
 (0)