1
1
//! Strongly typed property hints.
2
2
3
- use std:: fmt:: { self , Write } ;
3
+ use std:: fmt:: { self , Display , Write } ;
4
4
use std:: ops:: RangeInclusive ;
5
5
6
6
use crate :: core_types:: GodotString ;
@@ -116,21 +116,21 @@ where
116
116
/// ```
117
117
#[ derive( Clone , Eq , PartialEq , Debug , Default ) ]
118
118
pub struct EnumHint {
119
- values : Vec < ( String , Option < i64 > ) > ,
119
+ values : Vec < EnumHintEntry > ,
120
120
}
121
121
122
122
impl EnumHint {
123
123
#[ inline]
124
124
pub fn new ( values : Vec < String > ) -> Self {
125
- let values = values. into_iter ( ) . map ( |v| ( v , None ) ) . collect ( ) ;
125
+ let values = values. into_iter ( ) . map ( EnumHintEntry :: new ) . collect ( ) ;
126
126
EnumHint { values }
127
127
}
128
128
129
129
#[ inline]
130
- pub fn with_numbers ( values : Vec < ( String , i64 ) > ) -> Self {
130
+ pub fn with_values ( values : Vec < ( String , i64 ) > ) -> Self {
131
131
let values = values
132
132
. into_iter ( )
133
- . map ( |( key, val ) | ( key, Some ( val ) ) )
133
+ . map ( |( key, value ) | EnumHintEntry :: with_value ( key, value ) )
134
134
. collect ( ) ;
135
135
EnumHint { values }
136
136
}
@@ -140,28 +140,52 @@ impl EnumHint {
140
140
let mut s = String :: new ( ) ;
141
141
142
142
let mut iter = self . values . iter ( ) ;
143
- let write_item = |s : & mut String , item : & ( String , Option < i64 > ) | match item {
144
- ( key, Some ( val) ) => {
145
- write ! ( s, "{key}:{val}" )
146
- }
147
- ( key, None ) => {
148
- write ! ( s, "{key}" )
149
- }
150
- } ;
151
143
152
144
if let Some ( first) = iter. next ( ) {
153
- write_item ( & mut s, first) . unwrap ( ) ;
145
+ write ! ( s, "{ first}" ) . unwrap ( ) ;
154
146
}
155
147
156
148
for rest in iter {
157
149
write ! ( s, "," ) . unwrap ( ) ;
158
- write_item ( & mut s, rest) . unwrap ( ) ;
150
+ write ! ( s, "{ rest}" ) . unwrap ( ) ;
159
151
}
160
152
161
153
s. into ( )
162
154
}
163
155
}
164
156
157
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
158
+ pub struct EnumHintEntry {
159
+ key : String ,
160
+ value : Option < i64 > ,
161
+ }
162
+
163
+ impl EnumHintEntry {
164
+ #[ inline]
165
+ pub fn new ( key : String ) -> Self {
166
+ Self { key, value : None }
167
+ }
168
+
169
+ #[ inline]
170
+ pub fn with_value ( key : String , value : i64 ) -> Self {
171
+ Self {
172
+ key,
173
+ value : Some ( value) ,
174
+ }
175
+ }
176
+ }
177
+
178
+ impl Display for EnumHintEntry {
179
+ #[ inline]
180
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
181
+ write ! ( f, "{}" , self . key) ?;
182
+ if let Some ( value) = self . value {
183
+ write ! ( f, ":{}" , value) ?;
184
+ }
185
+ Ok ( ( ) )
186
+ }
187
+ }
188
+
165
189
/// Possible hints for integers.
166
190
#[ derive( Clone , Debug ) ]
167
191
#[ non_exhaustive]
@@ -495,6 +519,6 @@ godot_test!(test_enum_hint_without_mapping {
495
519
} ) ;
496
520
497
521
godot_test ! ( test_enum_hint_with_mapping {
498
- let hint = EnumHint :: with_numbers ( vec![ ( "Foo" . into( ) , 42 ) , ( "Bar" . into( ) , 67 ) ] ) ;
522
+ let hint = EnumHint :: with_values ( vec![ ( "Foo" . into( ) , 42 ) , ( "Bar" . into( ) , 67 ) ] ) ;
499
523
assert_eq!( hint. to_godot_hint_string( ) . to_string( ) , "Foo:42,Bar:67" . to_string( ) , ) ;
500
524
} ) ;
0 commit comments