|  | 
| 5 | 5 | import 'dart:async'; | 
| 6 | 6 | import 'dart:convert'; | 
| 7 | 7 | 
 | 
| 8 |  | -import 'package:async/async.dart'; | 
| 9 |  | -import 'package:crypto/crypto.dart' show Digest; | 
|  | 8 | +import 'package:crypto/crypto.dart'; | 
| 10 | 9 | 
 | 
| 11 | 10 | import '../../build.dart'; | 
| 12 | 11 | 
 | 
| 13 |  | -// This is not exported to hack around a package-private constructor. | 
| 14 |  | -PostProcessBuildStep postProcessBuildStep( | 
| 15 |  | -  AssetId inputId, | 
| 16 |  | -  AssetReader reader, | 
| 17 |  | -  AssetWriter writer, | 
| 18 |  | -  void Function(AssetId) addAsset, | 
| 19 |  | -  void Function(AssetId) deleteAsset, | 
| 20 |  | -) => PostProcessBuildStep._(inputId, reader, writer, addAsset, deleteAsset); | 
| 21 |  | - | 
| 22 | 12 | /// A simplified [BuildStep] which can only read its primary input, and can't | 
| 23 |  | -/// get a [Resolver] or any [Resource]s, at least for now. | 
| 24 |  | -class PostProcessBuildStep { | 
| 25 |  | -  final AssetId inputId; | 
| 26 |  | - | 
| 27 |  | -  final AssetReader _reader; | 
| 28 |  | -  final AssetWriter _writer; | 
| 29 |  | -  final void Function(AssetId) _addAsset; | 
| 30 |  | -  final void Function(AssetId) _deleteAsset; | 
| 31 |  | - | 
| 32 |  | -  /// The result of any writes which are starting during this step. | 
| 33 |  | -  final _writeResults = <Future<Result<void>>>[]; | 
|  | 13 | +/// get a [Resolver] or any [Resource]s. | 
|  | 14 | +abstract class PostProcessBuildStep { | 
|  | 15 | +  AssetId get inputId; | 
| 34 | 16 | 
 | 
| 35 |  | -  PostProcessBuildStep._( | 
| 36 |  | -    this.inputId, | 
| 37 |  | -    this._reader, | 
| 38 |  | -    this._writer, | 
| 39 |  | -    this._addAsset, | 
| 40 |  | -    this._deleteAsset, | 
| 41 |  | -  ); | 
|  | 17 | +  Future<Digest> digest(AssetId id); | 
| 42 | 18 | 
 | 
| 43 |  | -  Future<Digest> digest(AssetId id) => | 
| 44 |  | -      inputId == id | 
| 45 |  | -          ? _reader.digest(id) | 
| 46 |  | -          : Future.error(InvalidInputException(id)); | 
|  | 19 | +  Future<List<int>> readInputAsBytes(); | 
| 47 | 20 | 
 | 
| 48 |  | -  Future<List<int>> readInputAsBytes() => _reader.readAsBytes(inputId); | 
|  | 21 | +  Future<String> readInputAsString({Encoding encoding = utf8}); | 
| 49 | 22 | 
 | 
| 50 |  | -  Future<String> readInputAsString({Encoding encoding = utf8}) => | 
| 51 |  | -      _reader.readAsString(inputId, encoding: encoding); | 
| 52 |  | - | 
| 53 |  | -  Future<void> writeAsBytes(AssetId id, FutureOr<List<int>> bytes) { | 
| 54 |  | -    _addAsset(id); | 
| 55 |  | -    var done = _futureOrWrite( | 
| 56 |  | -      bytes, | 
| 57 |  | -      (List<int> b) => _writer.writeAsBytes(id, b), | 
| 58 |  | -    ); | 
| 59 |  | -    _writeResults.add(Result.capture(done)); | 
| 60 |  | -    return done; | 
| 61 |  | -  } | 
|  | 23 | +  Future<void> writeAsBytes(AssetId id, FutureOr<List<int>> bytes); | 
| 62 | 24 | 
 | 
| 63 | 25 |   Future<void> writeAsString( | 
| 64 | 26 |     AssetId id, | 
| 65 | 27 |     FutureOr<String> content, { | 
| 66 | 28 |     Encoding encoding = utf8, | 
| 67 |  | -  }) { | 
| 68 |  | -    _addAsset(id); | 
| 69 |  | -    var done = _futureOrWrite( | 
| 70 |  | -      content, | 
| 71 |  | -      (String c) => _writer.writeAsString(id, c, encoding: encoding), | 
| 72 |  | -    ); | 
| 73 |  | -    _writeResults.add(Result.capture(done)); | 
| 74 |  | -    return done; | 
| 75 |  | -  } | 
|  | 29 | +  }); | 
| 76 | 30 | 
 | 
| 77 | 31 |   /// Marks an asset for deletion in the post process step. | 
| 78 |  | -  void deletePrimaryInput() { | 
| 79 |  | -    _deleteAsset(inputId); | 
| 80 |  | -  } | 
|  | 32 | +  void deletePrimaryInput(); | 
| 81 | 33 | 
 | 
| 82 | 34 |   /// Waits for work to finish and cleans up resources. | 
| 83 | 35 |   /// | 
| 84 | 36 |   /// This method should be called after a build has completed. After the | 
| 85 | 37 |   /// returned [Future] completes then all outputs have been written. | 
| 86 |  | -  Future<void> complete() async { | 
| 87 |  | -    await Future.wait(_writeResults.map(Result.release)); | 
| 88 |  | -  } | 
|  | 38 | +  Future<void> complete(); | 
| 89 | 39 | } | 
| 90 |  | - | 
| 91 |  | -Future<void> _futureOrWrite<T>( | 
| 92 |  | -  FutureOr<T> content, | 
| 93 |  | -  Future<void> Function(T content) write, | 
| 94 |  | -) => (content is Future<T>) ? content.then(write) : write(content); | 
0 commit comments