w static method

void w(
  1. dynamic object, {
  2. dynamic level = LogLevel.FINE,
  3. dynamic header = true,
})

Implementation

static void w(dynamic object,
    {var level = LogLevel.FINE, var header = true}) {
  final frames = StackTrace.current.toString().split('\n');
  final callerFrame = frames
      .firstWhere(
        (frame) => !frame.contains('console.dart'),
        orElse: () => '',
      )
      .replaceFirst(RegExp(r'^\s*#?\d+\s+'), '')
      .trim();

  String startColor = "";
  String endColor = "\x1B[0m";

  switch (level) {
    case LogLevel.ERROR:
      startColor = "\x1B[38;5;196m"; // bright red
      break;

    case LogLevel.WARNING:
      startColor = "\x1B[38;2;255;193;7m";
      break;
    case LogLevel.DEBUG:
      startColor = "\x1B[38;2;150;150;150m"; // gray
      break;

    case LogLevel.FINE:
      startColor = "\x1B[38;2;80;220;120m"; // gray
      break;
  }

  StringBuffer str = StringBuffer();
  str.writeln("$startColor┌${"─" * 98}┐$endColor");
  if (header) {
    str.writeln("$startColor│ $callerFrame$endColor");
    str.writeln("$startColor├${"─" * 98}┤$endColor");
  }

  if (object is Map &&
      object.containsKey('error') &&
      object.containsKey('stack')) {
    str.writeln(
        "$startColor  $level ${DateTime.now().format('y-M-d H:m:s')} ${object['error']}$endColor");
    str.writeln("$startColor├${"─" * 98}┤$endColor");
    int index = 0;
    for (var s in object['stack'] as List) {
      var line = s.toString().replaceFirst(RegExp(r'^\s*\d+\s+'), '').trim();
      line = line.replaceAll('\n', ' ');
      if (line.isNotEmpty) {
        str.writeln("$startColor  ${++index}. $line$endColor");
      }
    }
  } else {
    for (var obLine in object.toString().split('\n')) {
      str.writeln("$startColor  $obLine$endColor");
    }
  }

  str.writeln(startColor + ("└${"─" * 98}┘") + endColor);

  print(str.toString());
}