Files
umbrix/lib/singbox/model/singbox_status.dart
problematicconsumer d1ec932fff Fix status mapper
2023-12-01 14:22:00 +03:30

51 lines
1.4 KiB
Dart

import 'package:dartx/dartx.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'singbox_status.freezed.dart';
@freezed
sealed class SingboxStatus with _$SingboxStatus {
const SingboxStatus._();
const factory SingboxStatus.stopped({
SingboxAlert? alert,
String? message,
}) = SingboxStopped;
const factory SingboxStatus.starting() = SingboxStarting;
const factory SingboxStatus.started() = SingboxStarted;
const factory SingboxStatus.stopping() = SingboxStopping;
factory SingboxStatus.fromEvent(dynamic event) {
switch (event) {
case {
"status": "Stopped",
"alert": final String? alertStr,
"message": final String? messageStr,
}:
final alert = SingboxAlert.values.firstOrNullWhere(
(e) => alertStr?.toLowerCase() == e.name.toLowerCase(),
);
return SingboxStatus.stopped(alert: alert, message: messageStr);
case {"status": "Stopped"}:
return const SingboxStatus.stopped();
case {"status": "Starting"}:
return const SingboxStarting();
case {"status": "Started"}:
return const SingboxStarted();
case {"status": "Stopping"}:
return const SingboxStopping();
default:
throw Exception("unexpected status [$event]");
}
}
}
enum SingboxAlert {
requestVPNPermission,
requestNotificationPermission,
emptyConfiguration,
startCommandServer,
createService,
startService;
}