8
8
#![ cfg_attr( not( feature = "std" ) , no_std) ]
9
9
10
10
pub use :: num_enum_derive:: {
11
- ConstFromPrimitive , ConstIntoPrimitive , Default , FromPrimitive , IntoPrimitive ,
12
- TryFromPrimitive , UnsafeFromPrimitive ,
11
+ ConstFromPrimitive , ConstIntoPrimitive , ConstTryFromPrimitive , Default , FromPrimitive ,
12
+ IntoPrimitive , TryFromPrimitive , UnsafeFromPrimitive ,
13
13
} ;
14
14
15
15
use :: core:: fmt;
@@ -29,6 +29,13 @@ pub trait TryFromPrimitive: Sized {
29
29
fn try_from_primitive ( number : Self :: Primitive ) -> Result < Self , Self :: Error > ;
30
30
}
31
31
32
+ pub trait ConstTryFromPrimitive : Sized {
33
+ type Primitive : Copy + Eq + fmt:: Debug ;
34
+ type Error ;
35
+
36
+ const NAME : & ' static str ;
37
+ }
38
+
32
39
pub trait UnsafeFromPrimitive : Sized {
33
40
type Primitive : Copy + Eq ;
34
41
@@ -85,6 +92,38 @@ impl<Enum: TryFromPrimitive> fmt::Display for TryFromPrimitiveError<Enum> {
85
92
#[ cfg( feature = "std" ) ]
86
93
impl < Enum : TryFromPrimitive > :: std:: error:: Error for TryFromPrimitiveError < Enum > { }
87
94
95
+ #[ derive( Copy , Clone , PartialEq , Eq ) ]
96
+ pub struct ConstTryFromPrimitiveError < Enum : ConstTryFromPrimitive > {
97
+ pub number : Enum :: Primitive ,
98
+ }
99
+
100
+ impl < Enum : ConstTryFromPrimitive > ConstTryFromPrimitiveError < Enum > {
101
+ pub const fn new ( number : Enum :: Primitive ) -> Self {
102
+ Self { number }
103
+ }
104
+ }
105
+
106
+ impl < Enum : ConstTryFromPrimitive > fmt:: Debug for ConstTryFromPrimitiveError < Enum > {
107
+ fn fmt ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
108
+ fmt. debug_struct ( "ConstTryFromPrimitiveError" )
109
+ . field ( "number" , & self . number )
110
+ . finish ( )
111
+ }
112
+ }
113
+ impl < Enum : ConstTryFromPrimitive > fmt:: Display for ConstTryFromPrimitiveError < Enum > {
114
+ fn fmt ( & self , stream : & ' _ mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
115
+ write ! (
116
+ stream,
117
+ "No discriminant in enum `{name}` matches the value `{input:?}`" ,
118
+ name = Enum :: NAME ,
119
+ input = self . number,
120
+ )
121
+ }
122
+ }
123
+
124
+ #[ cfg( feature = "std" ) ]
125
+ impl < Enum : ConstTryFromPrimitive > :: std:: error:: Error for ConstTryFromPrimitiveError < Enum > { }
126
+
88
127
// This trait exists to try to give a more clear error message when someone attempts to derive both FromPrimitive and TryFromPrimitive.
89
128
// This isn't allowed because both end up creating a `TryFrom<primitive>` implementation.
90
129
// TryFromPrimitive explicitly implements TryFrom<primitive> with Error=TryFromPrimitiveError, which conflicts with:
@@ -94,3 +133,7 @@ impl<Enum: TryFromPrimitive> ::std::error::Error for TryFromPrimitiveError<Enum>
94
133
// It is subject to change in any release regardless of semver.
95
134
#[ doc( hidden) ]
96
135
pub trait CannotDeriveBothFromPrimitiveAndTryFromPrimitive { }
136
+
137
+ // Similar, for const primitive coercion methods.
138
+ #[ doc( hidden) ]
139
+ pub trait CannotDeriveBothConstFromPrimitiveAndConstTryFromPrimitive { }
0 commit comments