Commit 9efb8c5

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-08-23 07:48:44
modernize switch expressions
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 8a66fb2
app/lib/data_util/display_interval_picker.dart → app/lib/data_util/interval_picker.dart
@@ -63,8 +63,8 @@ class IntervalPicker extends StatelessWidget {
                     }
                   },
                   items: [
-                    for (final e in TimeStep.options)
-                      DropdownMenuItem(value: e, child: Text(e.getName(loc))),
+                    for (final TimeStep e in TimeStep.values)
+                      DropdownMenuItem(value: e, child: Text(e.localize(loc))),
                   ]
                 ),
               ),
app/lib/features/settings/export_import_screen.dart
@@ -1,5 +1,5 @@
 import 'package:blood_pressure_app/components/disabled.dart';
-import 'package:blood_pressure_app/data_util/display_interval_picker.dart';
+import 'package:blood_pressure_app/data_util/interval_picker.dart';
 import 'package:blood_pressure_app/features/export_import/active_field_customization.dart';
 import 'package:blood_pressure_app/features/export_import/export_button_bar.dart';
 import 'package:blood_pressure_app/features/export_import/export_warn_banner.dart';
app/lib/model/export_import/import_field_type.dart
@@ -23,23 +23,14 @@ enum RowDataFieldType {
   /// Guarantees [List<(String medicineDesignation, double dosisMg)>] is returned.
   intakes;
 
-  /// Selection of a displayable string from [localizations].
-  String localize(AppLocalizations localizations) {
-    switch(this) {
-      case RowDataFieldType.timestamp:
-        return localizations.timestamp;
-      case RowDataFieldType.sys:
-        return localizations.sysLong;
-      case RowDataFieldType.dia:
-        return localizations.diaLong;
-      case pul:
-        return localizations.pulLong;
-      case RowDataFieldType.notes:
-        return localizations.notes;
-      case RowDataFieldType.color:
-        return localizations.color;
-      case RowDataFieldType.intakes:
-        return localizations.intakes;
-    }
-  }
+  /// Select the matching string from [localizations].
+  String localize(AppLocalizations localizations) => switch(this) {
+    timestamp => localizations.timestamp,
+    sys => localizations.sysLong,
+    dia => localizations.diaLong,
+    pul => localizations.pulLong,
+    notes => localizations.notes,
+    color => localizations.color,
+    intakes => localizations.intakes,
+  };
 }
app/lib/model/export_import/record_formatter.dart
@@ -42,37 +42,37 @@ class ScriptedFormatter implements Formatter {
   @override
   (RowDataFieldType, dynamic)? decode(String formattedRecord) {
     if (restoreAbleType == null) return null;
-
     final text = formattedRecord.substring(_padLeft!, formattedRecord.length - _padRight!);
 
-    final value = (){switch(restoreAbleType!) {
-      case RowDataFieldType.timestamp:
-        final num = int.tryParse(text);
-        if (num != null) return DateTime.fromMillisecondsSinceEpoch(num);
-        return null;
-      case RowDataFieldType.sys:
-      case RowDataFieldType.dia:
-      case RowDataFieldType.pul:
-        return int.tryParse(text);
-      case RowDataFieldType.notes:
-        return text;
-      case RowDataFieldType.color:
-        final num = int.tryParse(text);
-        if (num != null) return num;
-        try {
-          return MeasurementNeedlePin.fromMap(jsonDecode(text)).color.value;
-        } on FormatException {
-          return null;
-        } on TypeError {
-          return null;
-        }
-      case RowDataFieldType.intakes:
-        return NativeColumn.intakes.decode(text);
-    }}();
+    final value = switch(restoreAbleType!) {
+      RowDataFieldType.timestamp => _decodeTimestamp(text),
+      RowDataFieldType.sys || RowDataFieldType.dia || RowDataFieldType.pul => int.tryParse(text),
+      RowDataFieldType.notes => text,
+      RowDataFieldType.color => _decodeColor(text),
+      RowDataFieldType.intakes => NativeColumn.intakes.decode(text),
+    };
     if (value != null) return (restoreAbleType!, value);
     return null;
   }
 
+  DateTime? _decodeTimestamp(String text) {
+    final num = int.tryParse(text);
+    if (num != null) return DateTime.fromMillisecondsSinceEpoch(num);
+    return null;
+  }
+
+  int? _decodeColor(String text) {
+    final num = int.tryParse(text);
+    if (num != null) return num;
+    try {
+      return MeasurementNeedlePin.fromMap(jsonDecode(text)).color.value;
+    } on FormatException {
+      return null;
+    } on TypeError {
+      return null;
+    }
+  }
+
   @override
   String encode(BloodPressureRecord record, Note note, List<MedicineIntake> intakes) {
     var fieldContents = pattern;
app/lib/model/storage/convert_util.dart
@@ -92,22 +92,12 @@ class ConvertUtil {
   }
 
   /// Try to recreate the theme mode stored as a integer.
-  static ThemeMode? parseThemeMode(dynamic value) {
-    final int? intValue = ConvertUtil.parseInt(value);
-    switch(intValue) {
-      case null:
-        return null;
-      case 0:
-        return ThemeMode.system;
-      case 1:
-        return ThemeMode.dark;
-      case 2:
-        return ThemeMode.light;
-      default:
-        assert(false);
-        return null;
-    }
-  }
+  static ThemeMode? parseThemeMode(value) => switch(ConvertUtil.parseInt(value)) {
+    0 => ThemeMode.system,
+    1 => ThemeMode.dark,
+    2 => ThemeMode.light,
+    _ => null,
+  };
 
   /// Does its best attempt at parsing a time in arbitrary format.
   static DateTime? parseTime(dynamic time) {
app/lib/model/storage/export_columns_store.dart
@@ -14,10 +14,8 @@ class ExportColumnsManager extends ChangeNotifier {
       switch (c['t']) {
         case 0:
           manager.addOrUpdate(UserColumn.explicit(c['id'], c['csvTitle'], c['formatString']));
-          break;
         case 1:
           manager.addOrUpdate(TimeColumn.explicit(c['id'], c['csvTitle'], c['formatPattern']));
-          break;
         default:
           assert(false, 'Unexpected column type ${c['t']}.');
       }
app/lib/model/storage/intervall_store.dart
@@ -68,54 +68,38 @@ class IntervallStorage extends ChangeNotifier {
   void moveDataRangeByStep(int directionalStep) {
     final oldStart = currentRange.start;
     final oldEnd = currentRange.end;
-    switch (stepSize) {
-      case TimeStep.day:
-        currentRange = DateRange(
-          start: oldStart.add(Duration(days: directionalStep)),
-          end: oldEnd.add(Duration(days: directionalStep)),
-        );
-        break;
-      case TimeStep.week:
-      case TimeStep.last7Days:
-        currentRange = DateRange(
-          start: oldStart.add(Duration(days: directionalStep * 7)),
-          end: oldEnd.add(Duration(days: directionalStep * 7)),
-        );
-        break;
-      case TimeStep.month:
-        currentRange = DateRange(
-          // No fitting Duration: wraps correctly according to doc
-          start: oldStart.copyWith(month: oldStart.month + directionalStep),
-          end: oldEnd.copyWith(month: oldEnd.month + directionalStep),
-        );
-        break;
-      case TimeStep.year:
-        currentRange = DateRange(
-          // No fitting Duration: wraps correctly according to doc
-          start: oldStart.copyWith(year: oldStart.year + directionalStep),
-          end: oldEnd.copyWith(year: oldEnd.year + directionalStep),
-        );
-        break;
-      case TimeStep.lifetime:
-        currentRange = DateRange(
-            start: DateTime.fromMillisecondsSinceEpoch(1),
-            end: DateTime.now().copyWith(hour: 23, minute: 59, second: 59),
-        );
-        break;
-      case TimeStep.last30Days:
-        currentRange = DateRange(
-            start: oldStart.add(Duration(days: directionalStep * 30)),
-            end: oldEnd.add(Duration(days:  directionalStep * 30)),
-        );
-        break;
-      case TimeStep.custom:
-        final step = oldEnd.difference(oldStart) * directionalStep;
-        currentRange = DateRange(
-            start: oldStart.add(step),
-            end: oldEnd.add(step),
-        );
-        break;
-    }
+    currentRange = switch (stepSize) {
+      TimeStep.day => DateRange(
+        start: oldStart.add(Duration(days: directionalStep)),
+        end: oldEnd.add(Duration(days: directionalStep)),
+      ),
+      TimeStep.week || TimeStep.last7Days => DateRange(
+        start: oldStart.add(Duration(days: directionalStep * 7)),
+        end: oldEnd.add(Duration(days: directionalStep * 7)),
+      ),
+      TimeStep.month => DateRange(
+        // No fitting Duration: wraps correctly according to doc
+        start: oldStart.copyWith(month: oldStart.month + directionalStep),
+        end: oldEnd.copyWith(month: oldEnd.month + directionalStep),
+      ),
+      TimeStep.year => DateRange(
+        // No fitting Duration: wraps correctly according to doc
+        start: oldStart.copyWith(year: oldStart.year + directionalStep),
+        end: oldEnd.copyWith(year: oldEnd.year + directionalStep),
+      ),
+      TimeStep.lifetime => DateRange(
+        start: DateTime.fromMillisecondsSinceEpoch(1),
+        end: DateTime.now().copyWith(hour: 23, minute: 59, second: 59),
+      ),
+      TimeStep.last30Days => DateRange(
+        start: oldStart.add(Duration(days: directionalStep * 30)),
+        end: oldEnd.add(Duration(days:  directionalStep * 30)),
+      ),
+      TimeStep.custom => DateRange(
+        start: oldStart.add(oldEnd.difference(oldStart) * directionalStep),
+        end: oldEnd.add(oldEnd.difference(oldStart) * directionalStep),
+      ),
+    };
   }
 
   DateRange _getMostRecentDisplayIntervall() {
@@ -168,74 +152,43 @@ enum TimeStep {
   /// Recreate a TimeStep from a number created with [TimeStep.serialize].
   factory TimeStep.deserialize(value) {
     final int? intValue = ConvertUtil.parseInt(value);
-    if (intValue == null) return TimeStep.last7Days;
-
-    switch (intValue) {
-      case 0:
-        return TimeStep.day;
-      case 1:
-        return TimeStep.month;
-      case 2:
-        return TimeStep.year;
-      case 3:
-        return TimeStep.lifetime;
-      case 4:
-        return TimeStep.week;
-      case 5:
-        return TimeStep.last7Days;
-      case 6:
-        return TimeStep.last30Days;
-      case 7:
-        return TimeStep.custom;
-      default:
-        assert(false);
-        return TimeStep.last7Days;
-    }
+    assert(intValue == null || intValue >= 0 && intValue <= 7);
+    return switch (intValue) {
+      null => TimeStep.last7Days,
+      0 => TimeStep.day,
+      1 => TimeStep.month,
+      2 => TimeStep.year,
+      3 => TimeStep.lifetime,
+      4 => TimeStep.week,
+      5 => TimeStep.last7Days,
+      6 => TimeStep.last30Days,
+      7 => TimeStep.custom,
+      _ => TimeStep.last7Days,
+    };
   }
 
-  static const options = [TimeStep.day, TimeStep.week, TimeStep.month, TimeStep.year, TimeStep.lifetime, TimeStep.last7Days, TimeStep.last30Days, TimeStep.custom];
-
-  String getName(AppLocalizations localizations) {
-    switch (this) {
-      case TimeStep.day:
-        return localizations.day;
-      case TimeStep.month:
-        return localizations.month;
-      case TimeStep.year:
-        return localizations.year;
-      case TimeStep.lifetime:
-        return localizations.lifetime;
-      case TimeStep.week:
-        return localizations.week;
-      case TimeStep.last7Days:
-        return localizations.last7Days;
-      case TimeStep.last30Days:
-        return localizations.last30Days;
-      case TimeStep.custom:
-        return localizations.custom;
-    }
-  }
+  /// Select a displayable string from [localizations].
+  String localize(AppLocalizations localizations) => switch (this) {
+    TimeStep.day => localizations.day,
+    TimeStep.month => localizations.month,
+    TimeStep.year => localizations.year,
+    TimeStep.lifetime => localizations.lifetime,
+    TimeStep.week => localizations.week,
+    TimeStep.last7Days => localizations.last7Days,
+    TimeStep.last30Days => localizations.last30Days,
+    TimeStep.custom =>  localizations.custom,
+  };
 
-  int serialize() {
-    switch (this) {
-      case TimeStep.day:
-        return 0;
-      case TimeStep.month:
-        return 1;
-      case TimeStep.year:
-        return 2;
-      case TimeStep.lifetime:
-        return 3;
-      case TimeStep.week:
-        return 4;
-      case TimeStep.last7Days:
-        return 5;
-      case TimeStep.last30Days:
-        return 6;
-      case TimeStep.custom:
-        return 7;
-    }
-  }
+  int serialize() =>switch (this) {
+    TimeStep.day => 0,
+    TimeStep.month => 1,
+    TimeStep.year => 2,
+    TimeStep.lifetime => 3,
+    TimeStep.week => 4,
+    TimeStep.last7Days => 5,
+    TimeStep.last30Days => 6,
+    TimeStep.custom => 7,
+  };
 }
 
 /// Class that stores the interval objects that are needed in the app and provides named access to them. 
app/lib/screens/home_screen.dart
@@ -1,8 +1,8 @@
 import 'dart:collection';
 
 import 'package:blood_pressure_app/data_util/blood_pressure_builder.dart';
-import 'package:blood_pressure_app/data_util/display_interval_picker.dart';
 import 'package:blood_pressure_app/data_util/entry_context.dart';
+import 'package:blood_pressure_app/data_util/interval_picker.dart';
 import 'package:blood_pressure_app/data_util/repository_builder.dart';
 import 'package:blood_pressure_app/features/measurement_list/compact_measurement_list.dart';
 import 'package:blood_pressure_app/features/measurement_list/measurement_list.dart';
app/lib/screens/statistics_screen.dart
@@ -1,5 +1,5 @@
 import 'package:blood_pressure_app/data_util/blood_pressure_builder.dart';
-import 'package:blood_pressure_app/data_util/display_interval_picker.dart';
+import 'package:blood_pressure_app/data_util/interval_picker.dart';
 import 'package:blood_pressure_app/features/statistics/blood_pressure_distribution.dart';
 import 'package:blood_pressure_app/model/blood_pressure_analyzer.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';