Line data Source code
1 : import 'package:enum_assist/src/templates/template_core.dart';
2 : import 'package:enum_assist/src/util/util.dart';
3 :
4 : /// {@template enum_assist.map_template}
5 : /// Returns the map extension template
6 : /// {@endtemplate}
7 : class MaybeMapTemplate extends TemplateCoreSimple<_Item> {
8 : /// {@macro enum_assist.map_template}
9 0 : MaybeMapTemplate(String enumName, Iterable<String> fields)
10 0 : : super(enumName, fields);
11 :
12 0 : @override
13 : StringBuffer writeTemplate(StringBuffer buffer) {
14 : buffer
15 0 : ..writeln('''
16 : /// Optionally map all values of the enum
17 : ///
18 : /// default value is provided when value has not been mapped''')
19 0 : ..writeobj(
20 : 'T maybeMap<T extends Object?>',
21 : open: '({',
22 0 : body: (mapBuffer, tab) {
23 : mapBuffer
24 0 : ..writelnTab('required T orElse,', tab)
25 0 : ..writeln(map((i) => tabn(i.arg, tab)));
26 : },
27 : close: '})',
28 : )
29 0 : ..writeobj(
30 : '',
31 0 : body: (mapBuff, bodyTab) {
32 : mapBuff
33 0 : ..writelnTab('var isNullable = true;', bodyTab)
34 0 : ..writeln()
35 0 : ..writeobj('try', body: (tryBuff, tryTab) {
36 0 : tryBuff.writelnTab('final value = null as T;', tryTab);
37 : })
38 0 : ..writeobj('catch (_)', body: (catchBuff, catchTab) {
39 0 : catchBuff.writelnTab('isNullable = false;', catchTab);
40 : })
41 0 : ..writeln()
42 0 : ..writeobj(
43 : 'switch(this)',
44 : tab: bodyTab,
45 0 : body: (switchBuff, switchTab) {
46 0 : String caseItem(_Item item) {
47 0 : String _tab([int n = 0]) => tabn('', switchTab + n);
48 :
49 0 : return item.caseItem(_tab(), _tab(1));
50 : }
51 :
52 0 : switchBuff.writeln(map(caseItem));
53 : },
54 : );
55 : },
56 : ); // maybeMap
57 :
58 : return buffer;
59 : }
60 :
61 0 : @override
62 0 : _Item convert(String e) => _Item(enumName, e);
63 : }
64 :
65 : class _Item extends FieldTemplate<String> {
66 0 : const _Item(String enumName, String field) : super(enumName, field);
67 :
68 0 : String get orElseCheck => 'if ($field == null && !isNullable) return orElse;';
69 :
70 0 : String get arg => 'T? $field,';
71 :
72 0 : String get wholeEnum => '$enumName.$field';
73 :
74 0 : String get caseString => 'case $wholeEnum:';
75 :
76 0 : String get returnString => 'return $field as T;';
77 :
78 0 : String caseItem(String caseTab, String returnTab) => '''
79 0 : $caseTab$caseString
80 0 : $returnTab$orElseCheck
81 0 : $returnTab$returnString''';
82 : }
|