// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:async';

import 'package:logging/logging.dart';
import 'package:meta/meta.dart';

import '../asset/id.dart';
import '../asset/reader.dart';
import '../asset/writer.dart';
import '../builder/logging.dart';
import '../builder/post_process_build_step.dart';
import '../builder/post_process_builder.dart';

/// Run [builder] with [inputId] as the primary input.
///
/// [addAsset] should update the build systems knowledge of what assets exist.
/// If an asset should not be written this function should throw.
/// [deleteAsset] should remove the asset from the build system, it will not be
/// deleted on disk since the `writer` has no mechanism for delete.
Future<void> runPostProcessBuilder(PostProcessBuilder builder, AssetId inputId,
    AssetReader reader, AssetWriter writer, Logger logger,
    {@required void Function(AssetId) addAsset,
    @required void Function(AssetId) deleteAsset}) async {
  await scopeLogAsync(() async {
    var buildStep =
        postProcessBuildStep(inputId, reader, writer, addAsset, deleteAsset);
    try {
      await builder.build(buildStep);
    } finally {
      await buildStep.complete();
    }
  }, logger);
}
