Skip to content

Commit caf3a15

Browse files
authored
Support JsonEnum.valueField being set with 'index' (#1250)
Fixes #1249
1 parent f35aceb commit caf3a15

File tree

5 files changed

+35
-0
lines changed

5 files changed

+35
-0
lines changed

json_serializable/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## 6.6.0-dev
22

3+
- Support `JsonEnum.valueField` being set with `'index'`.
34
- Require Dart SDK `>=2.18.0`.
45
- Require `analyzer: ^5.2.0`
56
- Require `json_annotation: '>=4.8.0 <4.9.0'`

json_serializable/lib/src/enum_utils.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ Object? _generateEntry({
8888

8989
final e = fieldElementType.getField(valueField);
9090

91+
if (e == null && valueField == 'index') {
92+
return fieldElementType.fields
93+
.where((element) => element.isEnumConstant)
94+
.toList(growable: false)
95+
.indexOf(field);
96+
}
97+
9198
if (e == null || e.isStatic) {
9299
throw InvalidGenerationSourceError(
93100
'`JsonEnum.valueField` was set to "$valueField", but '

json_serializable/test/integration/integration_test.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,4 +467,8 @@ void main() {
467467
final instance = Regression1229();
468468
expect(instance.toJson(), isEmpty);
469469
});
470+
471+
test('value field index fun', () {
472+
expect(enumValueFieldIndexValues, [0, 701, 2]);
473+
});
470474
}

json_serializable/test/integration/json_enum_example.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,23 @@ enum MyStatusCode {
3838

3939
Iterable<int> get myStatusCodeEnumValues => _$MyStatusCodeEnumMap.values;
4040

41+
@JsonEnum(alwaysCreate: true, valueField: 'index')
42+
enum EnumValueFieldIndex {
43+
success(200),
44+
@JsonValue(701) // explicit value always takes precedence
45+
weird(601),
46+
oneMore(777);
47+
48+
static const tryingToBeConfusing = weird;
49+
50+
const EnumValueFieldIndex(this.value);
51+
52+
final int value;
53+
}
54+
55+
Iterable<int> get enumValueFieldIndexValues =>
56+
_$EnumValueFieldIndexEnumMap.values;
57+
4158
@JsonSerializable(
4259
createToJson: false,
4360
)

json_serializable/test/integration/json_enum_example.g.dart

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)