11//! Strongly typed property hints.
22
3- use std:: fmt:: { self , Write } ;
3+ use std:: fmt:: { self , Display , Write } ;
44use std:: ops:: RangeInclusive ;
55
66use crate :: core_types:: GodotString ;
@@ -116,21 +116,21 @@ where
116116/// ```
117117#[ derive( Clone , Eq , PartialEq , Debug , Default ) ]
118118pub struct EnumHint {
119- values : Vec < ( String , Option < i64 > ) > ,
119+ values : Vec < EnumHintEntry > ,
120120}
121121
122122impl EnumHint {
123123 #[ inline]
124124 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 ( ) ;
126126 EnumHint { values }
127127 }
128128
129129 #[ inline]
130- pub fn with_numbers ( values : Vec < ( String , i64 ) > ) -> Self {
130+ pub fn with_values ( values : Vec < ( String , i64 ) > ) -> Self {
131131 let values = values
132132 . into_iter ( )
133- . map ( |( key, val ) | ( key, Some ( val ) ) )
133+ . map ( |( key, value ) | EnumHintEntry :: with_value ( key, value ) )
134134 . collect ( ) ;
135135 EnumHint { values }
136136 }
@@ -140,28 +140,52 @@ impl EnumHint {
140140 let mut s = String :: new ( ) ;
141141
142142 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- } ;
151143
152144 if let Some ( first) = iter. next ( ) {
153- write_item ( & mut s, first) . unwrap ( ) ;
145+ write ! ( s, "{ first}" ) . unwrap ( ) ;
154146 }
155147
156148 for rest in iter {
157149 write ! ( s, "," ) . unwrap ( ) ;
158- write_item ( & mut s, rest) . unwrap ( ) ;
150+ write ! ( s, "{ rest}" ) . unwrap ( ) ;
159151 }
160152
161153 s. into ( )
162154 }
163155}
164156
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+
165189/// Possible hints for integers.
166190#[ derive( Clone , Debug ) ]
167191#[ non_exhaustive]
@@ -495,6 +519,6 @@ godot_test!(test_enum_hint_without_mapping {
495519} ) ;
496520
497521godot_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 ) ] ) ;
499523 assert_eq!( hint. to_godot_hint_string( ) . to_string( ) , "Foo:42,Bar:67" . to_string( ) , ) ;
500524} ) ;
0 commit comments