guru_sdk/guru_app/lib/financial/manifest/manifest_manager.dart

78 lines
2.3 KiB
Dart

import 'dart:async';
import 'package:guru_app/financial/igc/igc_manager.dart';
import 'package:guru_app/financial/product/product_model.dart';
import 'manifest.dart';
/// Created by Haoyi on 2022/8/21
typedef DetailsDistributor = Future<bool> Function(Details, TransactionMethod, String scene);
typedef ManifestBuilder = Future<Manifest?> Function(TransactionIntent);
class ManifestManager {
ManifestManager._() {
observableDeliveredManifest = deliveredManifestStream.stream.asBroadcastStream();
}
final StreamController<Manifest> deliveredManifestStream = StreamController();
static final ManifestManager instance = ManifestManager._();
late Stream<Manifest> observableDeliveredManifest;
final Map<String, DetailsDistributor> distributors = {
DetailsReservedType.igc: _deliverIgcDetails
};
final List<ManifestBuilder> builders = [];
static Future<bool> _deliverIgcDetails(
Details details, TransactionMethod method, String scene) async {
if (details.amount > 0) {
IgcManager.instance.accumulate(details.amount, method, scene: scene);
return true;
}
return false;
}
void addDistributor(String type, DetailsDistributor distributor) {
distributors[type] = distributor;
}
void addBuilder(ManifestBuilder builder) {
builders.add(builder);
}
void addBuilders(List<ManifestBuilder> builders) {
this.builders.addAll(builders);
}
Future<bool> deliver(Manifest manifest, TransactionMethod method) async {
bool result = false;
for (var details in manifest.details) {
result |= await distributors[details.type]?.call(details, method, manifest.scene) ?? false;
}
deliveredManifestStream.add(manifest);
return result;
}
Future<Manifest> createManifest(TransactionIntent intent) async {
for (var builder in builders) {
final manifest = await builder(intent);
if (manifest != null) {
return manifest;
}
}
return Manifest.empty;
}
Manifest createIgcManifest(int igc, {String? category, String scene = ""}) {
final details = <Details>[];
details.add(Details.define(DetailsReservedType.igc, igc));
final extras = <String, dynamic>{ExtraReservedField.scene: scene};
return Manifest(category ?? DetailsReservedType.igc, extras: extras, details: details);
}
}