/// <summary>
        /// Creates a new instance of <see cref="IDataSinkAdapter" /> with the provided configuration.
        /// </summary>
        /// <param name="configuration">Data sink adapter configuration.</param>
        /// <param name="context">Data transfer operation context.</param>
        /// <param name="cancellation">Cancellation token.</param>
        /// <returns>Task that represents asynchronous create operation.</returns>
        public async Task <IDataSinkAdapter> CreateAsync(IJsonFileSinkAdapterConfiguration configuration, IDataTransferContext context, CancellationToken cancellation)
        {
            Guard.NotNull("configuration", configuration);

            return(new JsonFileSinkAdapter(
                       await SinkStreamProvidersFactory.Create(configuration.File, configuration.Overwrite).CreateWriter(cancellation),
                       JsonSerializersFactory.Create(configuration.Prettify)));
        }
        public async Task <ITransferStatistics> Create(IErrorDetailsProvider errorDetailsProvider, ITransferStatisticsConfiguration configuration,
                                                       CancellationToken cancellation)
        {
            Guard.NotNull("configuration", configuration);

            return(String.IsNullOrEmpty(configuration.ErrorLog)
                ? (ITransferStatistics) new InMemoryTransferStatistics(errorDetailsProvider)
                : new CsvErrorLogTransferStatistics(
                       await SinkStreamProvidersFactory.Create(
                           configuration.ErrorLog, configuration.OverwriteErrorLog).CreateWriter(cancellation),
                       errorDetailsProvider));
        }
        public async Task <ITransferStatistics> Create(IErrorDetailsProvider errorDetailsProvider, ITransferStatisticsConfiguration configuration,
                                                       IReadOnlyDictionary <string, string> destConfiguration, CancellationToken cancellation)
        {
            Guard.NotNull("configuration", configuration);
            Guard.NotNull("destConfiguration", destConfiguration);

            if (configuration.EnableCosmosTableLog)
            {
                return(new CosmosDBErrorLogTransferStatistics(errorDetailsProvider, destConfiguration, configuration.CosmosTableLogConnectionString, cancellation));
            }

            return(String.IsNullOrEmpty(configuration.ErrorLog)
                ? (ITransferStatistics) new InMemoryTransferStatistics(errorDetailsProvider)
                : new CsvErrorLogTransferStatistics(
                       new StreamWriter(
                           await SinkStreamProvidersFactory.Create(configuration.ErrorLog, false, configuration.OverwriteErrorLog)
                           .CreateStream(cancellation)),
                       errorDetailsProvider));
        }