Skip to content

Commit 7138c8c

Browse files
committed
refactor(widgets): make AvailabilityStatus switches exhaustiveness-checked
Both switches over AvailabilityStatus in drink_card.dart were C-style switch statements, which are not exhaustiveness-checked. The semantic label switch had no safety net at all: a seventh enum value would fall through and silently omit availability from the screen-reader label. #349 established that the festival status_text vocabulary is not stable across festivals, so a new status value is a realistic event. Both are now switch expressions with no wildcard arm, so a new enum value is a compile error. Verified by adding a seventh value and confirming non_exhaustive_switch_expression fires at both sites. Output is unchanged. Fixes #534 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ER7MeRfgMqxnaKBGDaSRWy
1 parent c4f18d2 commit 7138c8c

1 file changed

Lines changed: 21 additions & 49 deletions

File tree

lib/widgets/drink_card.dart

Lines changed: 21 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -159,26 +159,18 @@ class DrinkCard extends StatelessWidget {
159159
buffer.write(', ${drink.breweryLocation}');
160160
}
161161
if (drink.availabilityStatus != null) {
162-
switch (drink.availabilityStatus!) {
163-
case AvailabilityStatus.plenty:
164-
buffer.write(', Available');
165-
break;
166-
case AvailabilityStatus.good:
167-
buffer.write(', Some remaining');
168-
break;
169-
case AvailabilityStatus.low:
170-
buffer.write(', Low availability');
171-
break;
172-
case AvailabilityStatus.veryLow:
173-
buffer.write(', Very low availability');
174-
break;
175-
case AvailabilityStatus.out:
176-
buffer.write(', Sold out');
177-
break;
178-
case AvailabilityStatus.unknown:
179-
buffer.write(', ${drink.statusText ?? 'Unknown availability'}');
180-
break;
181-
}
162+
// Switch *expression*, deliberately without a wildcard arm: a new
163+
// AvailabilityStatus value must break the build here rather than
164+
// silently drop availability from the screen-reader label (#534).
165+
buffer.write(switch (drink.availabilityStatus!) {
166+
AvailabilityStatus.plenty => ', Available',
167+
AvailabilityStatus.good => ', Some remaining',
168+
AvailabilityStatus.low => ', Low availability',
169+
AvailabilityStatus.veryLow => ', Very low availability',
170+
AvailabilityStatus.out => ', Sold out',
171+
AvailabilityStatus.unknown =>
172+
', ${drink.statusText ?? 'Unknown availability'}',
173+
});
182174
}
183175
if (drink.rating != null) {
184176
buffer.write(', Rated ${drink.rating} out of 5 stars');
@@ -274,35 +266,15 @@ class _AvailabilityChip extends StatelessWidget {
274266
status,
275267
theme.colorScheme,
276268
);
277-
String label;
278-
IconData icon;
279-
280-
switch (status) {
281-
case AvailabilityStatus.plenty:
282-
label = 'Available';
283-
icon = Icons.check_circle;
284-
break;
285-
case AvailabilityStatus.good:
286-
label = 'Some Left';
287-
icon = Icons.check_circle_outline;
288-
break;
289-
case AvailabilityStatus.low:
290-
label = 'Low';
291-
icon = Icons.warning;
292-
break;
293-
case AvailabilityStatus.veryLow:
294-
label = 'Nearly Gone';
295-
icon = Icons.warning_amber;
296-
break;
297-
case AvailabilityStatus.out:
298-
label = 'Sold Out';
299-
icon = Icons.cancel;
300-
break;
301-
case AvailabilityStatus.unknown:
302-
label = rawText ?? 'Unknown';
303-
icon = Icons.info_outline;
304-
break;
305-
}
269+
// Switch *expression*, deliberately without a wildcard arm — see #534.
270+
final (label, icon) = switch (status) {
271+
AvailabilityStatus.plenty => ('Available', Icons.check_circle),
272+
AvailabilityStatus.good => ('Some Left', Icons.check_circle_outline),
273+
AvailabilityStatus.low => ('Low', Icons.warning),
274+
AvailabilityStatus.veryLow => ('Nearly Gone', Icons.warning_amber),
275+
AvailabilityStatus.out => ('Sold Out', Icons.cancel),
276+
AvailabilityStatus.unknown => (rawText ?? 'Unknown', Icons.info_outline),
277+
};
306278

307279
return Container(
308280
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),

0 commit comments

Comments
 (0)