44
55namespace Wrkflow \GetValue ;
66
7+ use BackedEnum ;
78use DateTime ;
89use DateTimeImmutable ;
910use DateTimeInterface ;
11+ use TypeError ;
12+ use UnitEnum ;
1013use Wrkflow \GetValue \Actions \GetValidatedValueAction ;
1114use Wrkflow \GetValue \Actions \ValidateAction ;
1215use Wrkflow \GetValue \Builders \ExceptionBuilder ;
1821use Wrkflow \GetValue \DataHolders \AbstractData ;
1922use Wrkflow \GetValue \DataHolders \ArrayData ;
2023use Wrkflow \GetValue \Rules \BooleanRule ;
24+ use Wrkflow \GetValue \Rules \EnumRule ;
2125use Wrkflow \GetValue \Rules \NumericRule ;
2226use Wrkflow \GetValue \Rules \StringRule ;
2327use Wrkflow \GetValue \Strategies \DefaultTransformerStrategy ;
@@ -128,7 +132,7 @@ public function getBool(string $key, array $rules = [], ?array $transformers = n
128132 }
129133
130134 /**
131- * @param array<RuleContract> $rules
135+ * @param array<RuleContract> $rules
132136 * @param array<TransformerContract>|null $transformers
133137 */
134138 public function getRequiredBool (string $ key , array $ rules = [], ?array $ transformers = null ): bool
@@ -143,7 +147,7 @@ public function getRequiredBool(string $key, array $rules = [], ?array $transfor
143147 }
144148
145149 /**
146- * @param array<RuleContract> $rules
150+ * @param array<RuleContract> $rules
147151 * @param array<TransformerContract>|null $transformers
148152 */
149153 public function getString (string $ key , array $ rules = [], ?array $ transformers = null ): ?string
@@ -163,7 +167,7 @@ public function getString(string $key, array $rules = [], ?array $transformers =
163167 }
164168
165169 /**
166- * @param array<RuleContract> $rules
170+ * @param array<RuleContract> $rules
167171 * @param array<TransformerContract>|null $transformers
168172 */
169173 public function getRequiredString (string $ key , array $ rules = [], ?array $ transformers = null ): string
@@ -178,7 +182,48 @@ public function getRequiredString(string $key, array $rules = [], ?array $transf
178182 }
179183
180184 /**
181- * @param array<RuleContract> $rules
185+ * @template TEnum of BackedEnum
186+ * @param class-string<TEnum> $enum
187+ * @param array<RuleContract> $rules
188+ * @param array<TransformerContract>|null $transformers
189+ * @return TEnum|null
190+ */
191+ public function getEnum (string $ key , string $ enum , array $ rules = [], ?array $ transformers = null ): ?UnitEnum
192+ {
193+ $ value = $ this ->getString (key: $ key , rules: $ rules + [new EnumRule ($ enum )], transformers: $ transformers );
194+
195+ if ($ value === null ) {
196+ return null ;
197+ }
198+
199+ //At this moment I've not found a way to detect int/string enum
200+ try {
201+ return $ enum ::from ($ value );
202+ } catch (TypeError ) {
203+ return $ enum ::from ((int ) $ value );
204+ }
205+ }
206+
207+ /**
208+ * @template TEnum of BackedEnum
209+ * @param class-string<TEnum> $enum
210+ * @param array<RuleContract> $rules
211+ * @param array<TransformerContract>|null $transformers
212+ * @return TEnum
213+ */
214+ public function getRequiredEnum (string $ key , string $ enum , array $ rules = [], ?array $ transformers = null ): UnitEnum
215+ {
216+ $ value = $ this ->getEnum (key: $ key , enum: $ enum , rules: $ rules , transformers: $ transformers );
217+
218+ if ($ value instanceof BackedEnum === false ) {
219+ throw $ this ->exceptionBuilder ->missingValue ($ key );
220+ }
221+
222+ return $ value ;
223+ }
224+
225+ /**
226+ * @param array<RuleContract> $rules
182227 * @param array<TransformerContract>|null $transformers
183228 *
184229 * @return DateTime|DateTimeImmutable|null
@@ -200,7 +245,7 @@ public function getDateTime(string $key, array $rules = [], ?array $transformers
200245 }
201246
202247 /**
203- * @param array<RuleContract> $rules
248+ * @param array<RuleContract> $rules
204249 * @param array<TransformerContract>|null $transformers
205250 *
206251 * @return DateTime|DateTimeImmutable
0 commit comments