printTree method

Future<void> printTree(
  1. String path,
  2. void printLine(
    1. String
    ), {
  3. int maxDepth = 3,
})

Implementation

Future<void> printTree(
  String path,
  void Function(String) printLine, {
  int maxDepth = 3,
}) async {
  try {
    final root = await resolvePath(path);
    if (root['type'] != 'folder') {
      printLine("└── πŸ“„ ${p.basename(path)}");
      return;
    }

    final rootUuid = root['uuid'];
    final adjacency = await fetchAndParseTree(rootUuid);

    void printNode(String parentUuid, int currentDepth, String prefix) {
      if (currentDepth >= maxDepth) return;

      final children = adjacency[parentUuid] ?? [];
      children.sort((a, b) {
        if (a['type'] != b['type']) {
          return a['type'] == 'folder' ? -1 : 1;
        }
        return (a['name'] as String)
            .toLowerCase()
            .compareTo((b['name'] as String).toLowerCase());
      });

      for (var i = 0; i < children.length; i++) {
        final item = children[i];
        final isLast = (i == children.length - 1);
        final connector = isLast ? "└── " : "β”œβ”€β”€ ";

        if (item['type'] == 'folder') {
          printLine("$prefix$connectorπŸ“ ${item['name']}/");
          final childPrefix = prefix + (isLast ? "    " : "β”‚   ");
          printNode(item['uuid'], currentDepth + 1, childPrefix);
        } else {
          final size = formatSize(item['size']);
          printLine("$prefix$connectorπŸ“„ ${item['name']} ($size)");
        }
      }
    }

    printNode(rootUuid, 0, "");
  } catch (e) {
    printLine("└── ❌ Error: $e");
  }
}