foldApi<T extends Object> method

Future<T> foldApi<T extends Object>({
  1. required Future<T> onTendermint(
    1. IProvider<IServiceProvider<BaseServiceRequestParams, BaseGRPCServiceRequestParams>, IServiceRequestParams> provider
    ),
  2. required Future<T> onRest(
    1. IProvider<IServiceProvider<BaseServiceRequestParams, BaseGRPCServiceRequestParams>, IServiceRequestParams> provider
    ),
  3. required Future<T> onGrpc(
    1. IGrpcProvider<IServiceProvider<BaseServiceRequestParams, BaseGRPCServiceRequestParams>, IServiceRequestParams, BaseGRPCServiceRequestParams> provider
    ),
  4. CosmosProviderApi? api,
})

Implementation

Future<T> foldApi<T extends Object>({
  required Future<T> Function(IProvider provider) onTendermint,
  required Future<T> Function(IProvider provider) onRest,
  required Future<T> Function(IGrpcProvider provider) onGrpc,
  CosmosProviderApi? api,
}) async {
  if (api == null) {
    if (supportedApis.contains(CosmosProviderApi.tendermint)) {
      api = CosmosProviderApi.tendermint;
    } else if (supportedApis.contains(CosmosProviderApi.rest)) {
      api = CosmosProviderApi.rest;
    } else if (supportedApis.contains(CosmosProviderApi.grpc)) {
      api = CosmosProviderApi.grpc;
    }
  }
  return await switch (api) {
    CosmosProviderApi.tendermint => await onTendermint(provider),
    CosmosProviderApi.rest => await onRest(provider),
    CosmosProviderApi.grpc => () async {
      final provider = this.provider;
      if (provider is! IGrpcProvider) {
        throw const DartCosmosSdkPluginException(
          "Unexpected gRPC provider type.",
        );
      }
      return await onGrpc(provider);
    }(),
    _ =>
      throw DartCosmosSdkPluginException(
        "Unsupported api.",
        details: {
          "api": api?.name,
          "supportedApis": CosmosProviderApi.cosmosApis
              .map((e) => e.name)
              .join(", "),
        },
      ),
  };
}