// Copyright (c) 2012, 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 'interfaces.dart';
import 'pretty_print.dart';

/// The default implementation of [Description]. This should rarely need
/// substitution, although conceivably it is a place where other languages
/// could be supported.
class StringDescription implements Description {
  final StringBuffer _out = new StringBuffer();

  /// Initialize the description with initial contents [init].
  StringDescription([String init = '']) {
    _out.write(init);
  }

  int get length => _out.length;

  /// Get the description as a string.
  String toString() => _out.toString();

  /// Append [text] to the description.
  Description add(String text) {
    _out.write(text);
    return this;
  }

  /// Change the value of the description.
  Description replace(String text) {
    _out.clear();
    return add(text);
  }

  /// Appends a description of [value]. If it is an IMatcher use its
  /// describe method; if it is a string use its literal value after
  /// escaping any embedded control characters; otherwise use its
  /// toString() value and wrap it in angular "quotes".
  Description addDescriptionOf(value) {
    if (value is Matcher) {
      value.describe(this);
    } else {
      add(prettyPrint(value, maxLineLength: 80, maxItems: 25));
    }
    return this;
  }

  /// Append an [Iterable] [list] of objects to the description, using the
  /// specified [separator] and framing the list with [start]
  /// and [end].
  Description addAll(
      String start, String separator, String end, Iterable list) {
    var separate = false;
    add(start);
    for (var item in list) {
      if (separate) {
        add(separator);
      }
      addDescriptionOf(item);
      separate = true;
    }
    add(end);
    return this;
  }
}
