Skip to content

Commit bc1484e

Browse files
Refactor: Extract pushBreakdownRows helper to simplify breakdown row generation across commands
1 parent f4530c7 commit bc1484e

File tree

4 files changed

+59
-41
lines changed

4 files changed

+59
-41
lines changed

src/commands/daily.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { loadDailyUsageData } from '../data-loader.ts';
1111
import { detectMismatches, printMismatchReport } from '../debug.ts';
1212
import { log, logger } from '../logger.ts';
1313
import { sharedCommandConfig } from '../shared-args.internal.ts';
14-
import { formatCurrency, formatModelName, formatModelsDisplay, formatNumber } from '../utils.internal.ts';
14+
import { formatCurrency, formatModelsDisplay, formatNumber, pushBreakdownRows } from '../utils.internal.ts';
1515

1616
export const dailyCommand = define({
1717
name: 'daily',
@@ -114,18 +114,7 @@ export const dailyCommand = define({
114114

115115
// Add model breakdown rows if flag is set
116116
if (ctx.values.breakdown) {
117-
for (const breakdown of data.modelBreakdowns) {
118-
table.push([
119-
` └─ ${formatModelName(breakdown.modelName)}`,
120-
'',
121-
pc.gray(formatNumber(breakdown.inputTokens)),
122-
pc.gray(formatNumber(breakdown.outputTokens)),
123-
pc.gray(formatNumber(breakdown.cacheCreationTokens)),
124-
pc.gray(formatNumber(breakdown.cacheReadTokens)),
125-
pc.gray(formatNumber(breakdown.inputTokens + breakdown.outputTokens + breakdown.cacheCreationTokens + breakdown.cacheReadTokens)),
126-
pc.gray(formatCurrency(breakdown.cost)),
127-
]);
128-
}
117+
pushBreakdownRows(table, data.modelBreakdowns);
129118
}
130119
}
131120

src/commands/monthly.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { loadMonthlyUsageData } from '../data-loader.ts';
1111
import { detectMismatches, printMismatchReport } from '../debug.ts';
1212
import { log, logger } from '../logger.ts';
1313
import { sharedCommandConfig } from '../shared-args.internal.ts';
14-
import { formatCurrency, formatModelName, formatModelsDisplay, formatNumber } from '../utils.internal.ts';
14+
import { formatCurrency, formatModelsDisplay, formatNumber, pushBreakdownRows } from '../utils.internal.ts';
1515

1616
export const monthlyCommand = define({
1717
name: 'monthly',
@@ -125,18 +125,7 @@ export const monthlyCommand = define({
125125

126126
// Add model breakdown rows if flag is set
127127
if (ctx.values.breakdown) {
128-
for (const breakdown of data.modelBreakdowns) {
129-
table.push([
130-
` └─ ${formatModelName(breakdown.modelName)}`,
131-
'',
132-
pc.gray(formatNumber(breakdown.inputTokens)),
133-
pc.gray(formatNumber(breakdown.outputTokens)),
134-
pc.gray(formatNumber(breakdown.cacheCreationTokens)),
135-
pc.gray(formatNumber(breakdown.cacheReadTokens)),
136-
pc.gray(formatNumber(breakdown.inputTokens + breakdown.outputTokens + breakdown.cacheCreationTokens + breakdown.cacheReadTokens)),
137-
pc.gray(formatCurrency(breakdown.cost)),
138-
]);
139-
}
128+
pushBreakdownRows(table, data.modelBreakdowns);
140129
}
141130
}
142131

src/commands/session.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { loadSessionData } from '../data-loader.ts';
1111
import { detectMismatches, printMismatchReport } from '../debug.ts';
1212
import { log, logger } from '../logger.ts';
1313
import { sharedCommandConfig } from '../shared-args.internal.ts';
14-
import { formatCurrency, formatModelName, formatModelsDisplay, formatNumber } from '../utils.internal.ts';
14+
import { formatCurrency, formatModelsDisplay, formatNumber, pushBreakdownRows } from '../utils.internal.ts';
1515

1616
export const sessionCommand = define({
1717
name: 'session',
@@ -132,20 +132,8 @@ export const sessionCommand = define({
132132

133133
// Add model breakdown rows if flag is set
134134
if (ctx.values.breakdown) {
135-
for (const breakdown of data.modelBreakdowns) {
136-
table.push([
137-
` └─ ${formatModelName(breakdown.modelName)}`,
138-
'',
139-
'',
140-
pc.gray(formatNumber(breakdown.inputTokens)),
141-
pc.gray(formatNumber(breakdown.outputTokens)),
142-
pc.gray(formatNumber(breakdown.cacheCreationTokens)),
143-
pc.gray(formatNumber(breakdown.cacheReadTokens)),
144-
pc.gray(formatNumber(breakdown.inputTokens + breakdown.outputTokens + breakdown.cacheCreationTokens + breakdown.cacheReadTokens)),
145-
pc.gray(formatCurrency(breakdown.cost)),
146-
'',
147-
]);
148-
}
135+
// Session has 2 extra columns before data and 1 trailing column
136+
pushBreakdownRows(table, data.modelBreakdowns, 2, 1);
149137
}
150138
}
151139

src/utils.internal.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import pc from 'picocolors';
2+
13
export function formatNumber(num: number): string {
24
return num.toLocaleString('en-US');
35
}
@@ -43,3 +45,53 @@ export function formatModelsDisplay(models: string[]): string {
4345
const uniqueModels = [...new Set(models.map(formatModelName))];
4446
return uniqueModels.sort().join(', ');
4547
}
48+
49+
/**
50+
* Pushes model breakdown rows to a table
51+
* @param table - The table to push rows to
52+
* @param breakdowns - Array of model breakdowns
53+
* @param extraColumns - Number of extra empty columns before the data (default: 1 for models column)
54+
* @param trailingColumns - Number of extra empty columns after the data (default: 0)
55+
*/
56+
export function pushBreakdownRows(
57+
table: any[],
58+
breakdowns: Array<{
59+
modelName: string;
60+
inputTokens: number;
61+
outputTokens: number;
62+
cacheCreationTokens: number;
63+
cacheReadTokens: number;
64+
cost: number;
65+
}>,
66+
extraColumns = 1,
67+
trailingColumns = 0,
68+
): void {
69+
for (const breakdown of breakdowns) {
70+
const row: any[] = [` └─ ${formatModelName(breakdown.modelName)}`];
71+
72+
// Add extra empty columns before data
73+
for (let i = 0; i < extraColumns; i++) {
74+
row.push('');
75+
}
76+
77+
// Add data columns with gray styling
78+
const totalTokens = breakdown.inputTokens + breakdown.outputTokens
79+
+ breakdown.cacheCreationTokens + breakdown.cacheReadTokens;
80+
81+
row.push(
82+
pc.gray(formatNumber(breakdown.inputTokens)),
83+
pc.gray(formatNumber(breakdown.outputTokens)),
84+
pc.gray(formatNumber(breakdown.cacheCreationTokens)),
85+
pc.gray(formatNumber(breakdown.cacheReadTokens)),
86+
pc.gray(formatNumber(totalTokens)),
87+
pc.gray(formatCurrency(breakdown.cost)),
88+
);
89+
90+
// Add trailing empty columns
91+
for (let i = 0; i < trailingColumns; i++) {
92+
row.push('');
93+
}
94+
95+
table.push(row);
96+
}
97+
}

0 commit comments

Comments
 (0)