// 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 = StringBuffer();

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

  @override
  int get length => _out.length;

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

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

  /// Change the value of the description.
  @override
  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".
  @override
  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].
  @override
  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;
  }
}
