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

library barback.test.transformer.log;

import 'dart:async';

import 'package:barback/barback.dart';
import 'package:barback/src/utils.dart';

import 'mock.dart';

/// A transformer that logs given entries during its apply.
class LogTransformer extends MockTransformer {
  /// The list of entries that it should log.
  ///
  /// Each entry has the log level followed by the message, like:
  ///
  ///     error: This is the error message.
  final List<String> _entries;

  LogTransformer(this._entries);

  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);

  Future doApply(Transform transform) {
    return newFuture(() {
      for (var entry in _entries) {
        var parts = entry.split(":");
        var logFn;
        switch (parts[0]) {
          case "error":   logFn = transform.logger.error; break;
          case "warning": logFn = transform.logger.warning; break;
          case "info":    logFn = transform.logger.info; break;
        }

        logFn(parts[1].trim());
      }
    });
  }
}
