import 'package:fl_clash/enum/enum.dart'; import 'package:fl_clash/models/models.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'generated/core.freezed.dart'; part 'generated/core.g.dart'; @freezed abstract class SetupParams with _$SetupParams { const factory SetupParams({ @JsonKey(name: 'selected-map') required Map selectedMap, @JsonKey(name: 'test-url') required String testUrl, }) = _SetupParams; factory SetupParams.fromJson(Map json) => _$SetupParamsFromJson(json); } @freezed abstract class UpdateParams with _$UpdateParams { const factory UpdateParams({ required Tun tun, @JsonKey(name: 'mixed-port') required int mixedPort, @JsonKey(name: 'allow-lan') required bool allowLan, @JsonKey(name: 'find-process-mode') required FindProcessMode findProcessMode, required Mode mode, @JsonKey(name: 'log-level') required LogLevel logLevel, required bool ipv6, @JsonKey(name: 'tcp-concurrent') required bool tcpConcurrent, @JsonKey(name: 'external-controller') required ExternalControllerStatus externalController, @JsonKey(name: 'unified-delay') required bool unifiedDelay, }) = _UpdateParams; factory UpdateParams.fromJson(Map json) => _$UpdateParamsFromJson(json); } @freezed abstract class VpnOptions with _$VpnOptions { const factory VpnOptions({ required bool enable, required int port, required bool ipv6, required bool dnsHijacking, required AccessControlProps accessControlProps, required bool allowBypass, required bool systemProxy, required List bypassDomain, required String stack, @Default([]) List routeAddress, }) = _VpnOptions; factory VpnOptions.fromJson(Map json) => _$VpnOptionsFromJson(json); } @freezed abstract class InitParams with _$InitParams { const factory InitParams({ @JsonKey(name: 'home-dir') required String homeDir, required int version, }) = _InitParams; factory InitParams.fromJson(Map json) => _$InitParamsFromJson(json); } @freezed abstract class ChangeProxyParams with _$ChangeProxyParams { const factory ChangeProxyParams({ @JsonKey(name: 'group-name') required String groupName, @JsonKey(name: 'proxy-name') required String proxyName, }) = _ChangeProxyParams; factory ChangeProxyParams.fromJson(Map json) => _$ChangeProxyParamsFromJson(json); } @freezed abstract class UpdateGeoDataParams with _$UpdateGeoDataParams { const factory UpdateGeoDataParams({ @JsonKey(name: 'geo-type') required String geoType, @JsonKey(name: 'geo-name') required String geoName, }) = _UpdateGeoDataParams; factory UpdateGeoDataParams.fromJson(Map json) => _$UpdateGeoDataParamsFromJson(json); } @freezed abstract class CoreEvent with _$CoreEvent { const factory CoreEvent({required CoreEventType type, dynamic data}) = _CoreEvent; factory CoreEvent.fromJson(Map json) => _$CoreEventFromJson(json); } @freezed abstract class InvokeMessage with _$InvokeMessage { const factory InvokeMessage({required InvokeMessageType type, dynamic data}) = _InvokeMessage; factory InvokeMessage.fromJson(Map json) => _$InvokeMessageFromJson(json); } @freezed abstract class Delay with _$Delay { const factory Delay({required String name, required String url, int? value}) = _Delay; factory Delay.fromJson(Map json) => _$DelayFromJson(json); } @freezed abstract class Now with _$Now { const factory Now({required String name, required String value}) = _Now; factory Now.fromJson(Map json) => _$NowFromJson(json); } @freezed abstract class ProviderSubscriptionInfo with _$ProviderSubscriptionInfo { const factory ProviderSubscriptionInfo({ @JsonKey(name: 'UPLOAD') @Default(0) int upload, @JsonKey(name: 'DOWNLOAD') @Default(0) int download, @JsonKey(name: 'TOTAL') @Default(0) int total, @JsonKey(name: 'EXPIRE') @Default(0) int expire, }) = _ProviderSubscriptionInfo; factory ProviderSubscriptionInfo.fromJson(Map json) => _$ProviderSubscriptionInfoFromJson(json); } SubscriptionInfo? subscriptionInfoFormCore(Map? json) { if (json == null) return null; return SubscriptionInfo( upload: (json['Upload'] as num?)?.toInt() ?? 0, download: (json['Download'] as num?)?.toInt() ?? 0, total: (json['Total'] as num?)?.toInt() ?? 0, expire: (json['Expire'] as num?)?.toInt() ?? 0, ); } @freezed abstract class ExternalProvider with _$ExternalProvider { const factory ExternalProvider({ required String name, required String type, String? path, required int count, @JsonKey(name: 'subscription-info', fromJson: subscriptionInfoFormCore) SubscriptionInfo? subscriptionInfo, @JsonKey(name: 'vehicle-type') required String vehicleType, @JsonKey(name: 'update-at') required DateTime updateAt, }) = _ExternalProvider; factory ExternalProvider.fromJson(Map json) => _$ExternalProviderFromJson(json); } extension ExternalProviderExt on ExternalProvider { String get updatingKey => 'provider_$name'; } @freezed abstract class Action with _$Action { const factory Action({ required ActionMethod method, required dynamic data, required String id, }) = _Action; factory Action.fromJson(Map json) => _$ActionFromJson(json); } @freezed abstract class ProxiesData with _$ProxiesData { const factory ProxiesData({ required Map proxies, required List all, }) = _ProxiesData; factory ProxiesData.fromJson(Map json) => _$ProxiesDataFromJson(json); } @freezed abstract class ActionResult with _$ActionResult { const factory ActionResult({ required ActionMethod method, required dynamic data, String? id, @Default(ResultType.success) ResultType code, }) = _ActionResult; factory ActionResult.fromJson(Map json) => _$ActionResultFromJson(json); } extension ActionResultExt on ActionResult { Result get toResult { if (code == ResultType.success) { return Result.success(data); } else { return Result.error('$data'); } } }