// Copyright (c) 2015, 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.

// @dart = 2.10

/// Null pattern implementation of the [api.CompilerOutput] interface.

library compiler.null_api;

import '../compiler_api.dart' as api;

/// Null pattern implementation of the [api.CompilerOutput] interface.
class NullCompilerOutput implements api.CompilerOutput {
  const NullCompilerOutput();

  @override
  api.OutputSink createOutputSink(
      String name, String extension, api.OutputType type) {
    return NullSink.outputProvider(name, extension, type);
  }

  @override
  api.BinaryOutputSink createBinarySink(Uri uri) {
    return NullBinarySink(uri);
  }
}

/// A sink that discards the data.
class NullSink implements api.OutputSink {
  final String name;

  NullSink(this.name);

  @override
  void add(String value) {}

  @override
  void close() {}

  @override
  String toString() => name;

  /// Convenience method for getting an [api.CompilerOutputProvider].
  static NullSink outputProvider(
      String name, String extension, api.OutputType type) {
    return NullSink('$name.$extension.$type');
  }
}

class NullBinarySink implements api.BinaryOutputSink {
  final Uri uri;

  NullBinarySink(this.uri);

  @override
  void write(List<int> buffer, [int start = 0, int end]) {}

  @override
  void close() {}

  @override
  String toString() => 'NullBinarySink($uri)';
}
