1
- use enumcapsulate:: {
2
- AsVariant , AsVariantMut , AsVariantRef , Encapsulate , FromVariant , IntoVariant ,
3
- } ;
1
+ use enumcapsulate:: Encapsulate ;
4
2
pub struct VariantA ;
5
3
#[ automatically_derived]
6
4
impl :: core:: clone:: Clone for VariantA {
@@ -17,46 +15,41 @@ impl ::core::clone::Clone for VariantB {
17
15
VariantB
18
16
}
19
17
}
20
- pub enum Enum {
21
- VariantA ( VariantA ) ,
22
- VariantB { b : VariantB } ,
23
- }
24
- impl :: core:: convert:: From < VariantA > for Enum {
25
- fn from ( inner : VariantA ) -> Self {
26
- Self :: VariantA ( inner)
27
- }
28
- }
29
- impl :: core:: convert:: From < VariantB > for Enum {
30
- fn from ( inner : VariantB ) -> Self {
31
- Self :: VariantB { b : inner }
18
+ pub struct VariantC ;
19
+ #[ automatically_derived]
20
+ impl :: core:: clone:: Clone for VariantC {
21
+ #[ inline]
22
+ fn clone ( & self ) -> VariantC {
23
+ VariantC
32
24
}
33
25
}
34
- impl :: core:: convert:: TryFrom < Enum > for VariantA {
35
- type Error = Enum ;
36
- fn try_from ( outer : Enum ) -> Result < Self , Self :: Error > {
37
- match outer {
38
- Enum :: VariantA ( inner, ..) => Ok ( inner) ,
39
- err => Err ( err) ,
40
- }
26
+ pub struct VariantD ;
27
+ #[ automatically_derived]
28
+ impl :: core:: clone:: Clone for VariantD {
29
+ #[ inline]
30
+ fn clone ( & self ) -> VariantD {
31
+ VariantD
41
32
}
42
33
}
43
- impl :: core :: convert :: TryFrom < Enum > for VariantB {
44
- type Error = Enum ;
45
- fn try_from ( outer : Enum ) -> Result < Self , Self :: Error > {
46
- match outer {
47
- Enum :: VariantB { b : inner , .. } => Ok ( inner ) ,
48
- err => Err ( err ) ,
49
- }
50
- }
34
+ # [ enumcapsulate ( exclude ( From , TryInto ) ) ]
35
+ pub enum Enum {
36
+ OneTupleField ( VariantA ) ,
37
+ OneStructField { variant : VariantB } ,
38
+ # [ enumcapsulate ( exclude ) ]
39
+ ExcludedWildcard ( VariantC ) ,
40
+ # [ enumcapsulate ( exclude ( FromVariant , AsVariant ) ) ]
41
+ ExcludedSelective ( VariantD ) ,
51
42
}
52
43
impl :: enumcapsulate:: FromVariant < VariantA > for Enum {
53
44
fn from_variant ( inner : VariantA ) -> Self {
54
- Self :: VariantA ( inner)
45
+ Self :: OneTupleField ( inner)
55
46
}
56
47
}
57
48
impl :: enumcapsulate:: FromVariant < VariantB > for Enum {
58
49
fn from_variant ( inner : VariantB ) -> Self {
59
- Self :: VariantB { b : inner }
50
+ Self :: OneStructField {
51
+ variant : inner,
52
+ }
60
53
}
61
54
}
62
55
impl :: enumcapsulate:: AsVariant < VariantA > for Enum
65
58
{
66
59
fn as_variant ( & self ) -> Option < VariantA > {
67
60
match self {
68
- Enum :: VariantA ( inner, ..) => Some ( inner. clone ( ) ) ,
61
+ Enum :: OneTupleField ( inner, ..) => Some ( inner. clone ( ) ) ,
69
62
_ => None ,
70
63
}
71
64
}
@@ -76,63 +69,89 @@ where
76
69
{
77
70
fn as_variant ( & self ) -> Option < VariantB > {
78
71
match self {
79
- Enum :: VariantB { b : inner, .. } => Some ( inner. clone ( ) ) ,
72
+ Enum :: OneStructField { variant : inner, .. } => Some ( inner. clone ( ) ) ,
80
73
_ => None ,
81
74
}
82
75
}
83
76
}
84
77
impl :: enumcapsulate:: AsVariantRef < VariantA > for Enum {
85
78
fn as_variant_ref ( & self ) -> Option < & VariantA > {
86
79
match self {
87
- Enum :: VariantA ( inner, ..) => Some ( inner) ,
80
+ Enum :: OneTupleField ( inner, ..) => Some ( inner) ,
88
81
_ => None ,
89
82
}
90
83
}
91
84
}
92
85
impl :: enumcapsulate:: AsVariantRef < VariantB > for Enum {
93
86
fn as_variant_ref ( & self ) -> Option < & VariantB > {
94
87
match self {
95
- Enum :: VariantB { b : inner, .. } => Some ( inner) ,
88
+ Enum :: OneStructField { variant : inner, .. } => Some ( inner) ,
89
+ _ => None ,
90
+ }
91
+ }
92
+ }
93
+ impl :: enumcapsulate:: AsVariantRef < VariantD > for Enum {
94
+ fn as_variant_ref ( & self ) -> Option < & VariantD > {
95
+ match self {
96
+ Enum :: ExcludedSelective ( inner, ..) => Some ( inner) ,
96
97
_ => None ,
97
98
}
98
99
}
99
100
}
100
101
impl :: enumcapsulate:: AsVariantMut < VariantA > for Enum {
101
102
fn as_variant_mut ( & mut self ) -> Option < & mut VariantA > {
102
103
match self {
103
- Enum :: VariantA ( inner, ..) => Some ( inner) ,
104
+ Enum :: OneTupleField ( inner, ..) => Some ( inner) ,
104
105
_ => None ,
105
106
}
106
107
}
107
108
}
108
109
impl :: enumcapsulate:: AsVariantMut < VariantB > for Enum {
109
110
fn as_variant_mut ( & mut self ) -> Option < & mut VariantB > {
110
111
match self {
111
- Enum :: VariantB { b : inner, .. } => Some ( inner) ,
112
+ Enum :: OneStructField { variant : inner, .. } => Some ( inner) ,
113
+ _ => None ,
114
+ }
115
+ }
116
+ }
117
+ impl :: enumcapsulate:: AsVariantMut < VariantD > for Enum {
118
+ fn as_variant_mut ( & mut self ) -> Option < & mut VariantD > {
119
+ match self {
120
+ Enum :: ExcludedSelective ( inner, ..) => Some ( inner) ,
112
121
_ => None ,
113
122
}
114
123
}
115
124
}
116
125
impl :: enumcapsulate:: IntoVariant < VariantA > for Enum {
117
126
fn into_variant ( self ) -> Result < VariantA , Self > {
118
127
match self {
119
- Enum :: VariantA ( inner, ..) => Ok ( inner) ,
128
+ Enum :: OneTupleField ( inner, ..) => Ok ( inner) ,
120
129
err => Err ( err) ,
121
130
}
122
131
}
123
132
}
124
133
impl :: enumcapsulate:: IntoVariant < VariantB > for Enum {
125
134
fn into_variant ( self ) -> Result < VariantB , Self > {
126
135
match self {
127
- Enum :: VariantB { b : inner, .. } => Ok ( inner) ,
136
+ Enum :: OneStructField { variant : inner, .. } => Ok ( inner) ,
137
+ err => Err ( err) ,
138
+ }
139
+ }
140
+ }
141
+ impl :: enumcapsulate:: IntoVariant < VariantD > for Enum {
142
+ fn into_variant ( self ) -> Result < VariantD , Self > {
143
+ match self {
144
+ Enum :: ExcludedSelective ( inner, ..) => Ok ( inner) ,
128
145
err => Err ( err) ,
129
146
}
130
147
}
131
148
}
132
149
impl :: enumcapsulate:: VariantDowncast for Enum { }
133
150
pub enum EnumDiscriminant {
134
- VariantA ,
135
- VariantB ,
151
+ OneTupleField ,
152
+ OneStructField ,
153
+ ExcludedWildcard ,
154
+ ExcludedSelective ,
136
155
}
137
156
#[ automatically_derived]
138
157
impl :: core:: marker:: Copy for EnumDiscriminant { }
@@ -176,8 +195,10 @@ impl ::core::fmt::Debug for EnumDiscriminant {
176
195
:: core:: fmt:: Formatter :: write_str (
177
196
f,
178
197
match self {
179
- EnumDiscriminant :: VariantA => "VariantA" ,
180
- EnumDiscriminant :: VariantB => "VariantB" ,
198
+ EnumDiscriminant :: OneTupleField => "OneTupleField" ,
199
+ EnumDiscriminant :: OneStructField => "OneStructField" ,
200
+ EnumDiscriminant :: ExcludedWildcard => "ExcludedWildcard" ,
201
+ EnumDiscriminant :: ExcludedSelective => "ExcludedSelective" ,
181
202
} ,
182
203
)
183
204
}
@@ -186,18 +207,12 @@ impl ::enumcapsulate::VariantDiscriminant for Enum {
186
207
type Discriminant = EnumDiscriminant ;
187
208
fn variant_discriminant ( & self ) -> Self :: Discriminant {
188
209
match self {
189
- Enum :: VariantA ( ..) => EnumDiscriminant :: VariantA ,
190
- Enum :: VariantB { .. } => EnumDiscriminant :: VariantB ,
210
+ Enum :: OneTupleField ( ..) => EnumDiscriminant :: OneTupleField ,
211
+ Enum :: OneStructField { .. } => EnumDiscriminant :: OneStructField ,
212
+ Enum :: ExcludedWildcard ( ..) => EnumDiscriminant :: ExcludedWildcard ,
213
+ Enum :: ExcludedSelective ( ..) => EnumDiscriminant :: ExcludedSelective ,
191
214
_ => :: core:: panicking:: panic ( "internal error: entered unreachable code" ) ,
192
215
}
193
216
}
194
217
}
195
- fn check < T , U > ( )
196
- where
197
- T : FromVariant < U > + IntoVariant < U > + From < U > + TryInto < U > + AsVariant < U >
198
- + AsVariantRef < U > + AsVariantMut < U > ,
199
- { }
200
- fn main ( ) {
201
- check :: < Enum , VariantA > ( ) ;
202
- check :: < Enum , VariantB > ( ) ;
203
- }
218
+ fn main ( ) { }
0 commit comments