refactor(report): extract ReportGenerator abstraction for pretty/csv/json; simplify report rendering in main

This commit is contained in:
Sergey Penkovsky
2025-08-06 22:02:41 +03:00
parent bae940f374
commit 3ce21f55e4

View File

@@ -146,6 +146,52 @@ T parseEnum<T>(String value, List<T> values, T defaultValue) {
);
}
/// --- Report Generation ---
abstract class ReportGenerator {
String render(List<Map<String, dynamic>> results);
List<String> get keys;
}
class PrettyReport extends ReportGenerator {
@override
final List<String> keys = [
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
'min_us','max_us','trials','memory_diff_kb','delta_peak_kb','peak_rss_kb'
];
@override
String render(List<Map<String, dynamic>> rows) {
final header = keys.join('\t');
final lines = rows.map((r) => keys.map((k) => (r[k] ?? '').toString()).join('\t')).toList();
return ([header] + lines).join('\n');
}
}
class CsvReport extends ReportGenerator {
@override
final List<String> keys = [
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
'min_us','max_us','trials','timings_us','memory_diff_kb','delta_peak_kb','peak_rss_kb'
];
@override
String render(List<Map<String, dynamic>> rows) {
final header = keys.join(',');
final lines = rows.map((r) =>
keys.map((k) {
final v = r[k];
if (v is List) return '"${v.join(';')}"';
return (v ?? '').toString();
}).join(',')
).toList();
return ([header] + lines).join('\n');
}
}
class JsonReport extends ReportGenerator {
@override
List<String> get keys => [];
@override
String render(List<Map<String, dynamic>> rows) {
return '[\n${rows.map((r) => ' $r').join(',\n')}\n]';
}
}
Future<void> main(List<String> args) async {
final parser = ArgParser()
..addOption('benchmark', abbr: 'b', defaultsTo: 'chainSingleton')
@@ -235,42 +281,13 @@ Future<void> main(List<String> args) async {
}
}
}
if (format == 'json') {
print(_toJson(results));
} else if (format == 'csv') {
print(_toCsv(results));
} else {
print(_toPretty(results));
}
final reportGenerators = {
'pretty': PrettyReport(),
'csv': CsvReport(),
'json': JsonReport(),
};
print(reportGenerators[format]?.render(results) ?? PrettyReport().render(results));
}
// --- helpers ---
List<int> _parseIntList(String s) => s.split(',').map((e) => int.tryParse(e.trim()) ?? 0).where((x) => x > 0).toList();
String _toPretty(List<Map<String, dynamic>> rows) {
final keys = [
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
'min_us','max_us','trials','memory_diff_kb','delta_peak_kb','peak_rss_kb'
];
final header = keys.join('\t');
final lines = rows.map((r) => keys.map((k) => (r[k] ?? '').toString()).join('\t')).toList();
return ([header] + lines).join('\n');
}
String _toCsv(List<Map<String, dynamic>> rows) {
final keys = [
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
'min_us','max_us','trials','timings_us','memory_diff_kb','delta_peak_kb','peak_rss_kb'
];
final header = keys.join(',');
final lines = rows.map((r) =>
keys.map((k) {
final v = r[k];
if (v is List) return '"${v.join(';')}"';
return (v ?? '').toString();
}).join(',')
).toList();
return ([header] + lines).join('\n');
}
String _toJson(List<Map<String, dynamic>> rows) {
return '[\n${rows.map((r) => ' $r').join(',\n')}\n]';
}
// --- end helpers ---