Skip to content

Commit 159fdde

Browse files
Boshra MahmoudiBoshra Mahmoudi
authored andcommitted
replace repetitive code with a function
1 parent 288404b commit 159fdde

1 file changed

Lines changed: 64 additions & 57 deletions

File tree

  • implement-shell-tools/wc

‎implement-shell-tools/wc/wc.js‎

Lines changed: 64 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,61 @@
11
import { readFile } from "node:fs/promises";
22
import process from "node:process";
3+
import { parseArgs } from "node:util";
4+
5+
const { values, positionals: files } = parseArgs({
6+
args: process.argv.slice(2),
7+
8+
options: {
9+
lines: {
10+
type: "boolean",
11+
short: "l",
12+
},
13+
14+
words: {
15+
type: "boolean",
16+
short: "w",
17+
},
18+
19+
bytes: {
20+
type: "boolean",
21+
short: "c",
22+
},
23+
},
24+
25+
allowPositionals: true,
26+
});
27+
28+
const countLines = values.lines ?? false;
29+
const countWords = values.words ?? false;
30+
const countBytes = values.bytes ?? false;
31+
32+
function printCounts(lines, words, bytes, label) {
33+
const parts = [];
34+
35+
if (countLines) {
36+
parts.push(lines);
37+
}
38+
39+
if (countWords) {
40+
parts.push(words);
41+
}
42+
43+
if (countBytes) {
44+
parts.push(bytes);
45+
}
46+
47+
if (!countLines && !countWords && !countBytes) {
48+
parts.push(lines, words, bytes);
49+
}
50+
51+
const output = parts.map((value) => String(value).padStart(8)).join("");
52+
53+
process.stdout.write(`${output} ${label}\n`);
54+
}
355

4-
const argvs= process.argv.slice(2);
5-
let countLines = false;
6-
let countWords = false;
7-
let countBytes = false;
856
let totalWords = 0;
957
let totalLines = 0;
1058
let totalBytes = 0;
11-
const files = []
12-
13-
for (const arg of argvs) {
14-
if (arg === "-l") {
15-
countLines = true;
16-
} else if (arg === "-w") {
17-
countWords = true;
18-
} else if (arg === "-c") {
19-
countBytes = true;
20-
} else {
21-
files.push(arg);
22-
}
23-
}
2459

2560
for (const file of files) {
2661
try {
@@ -32,47 +67,19 @@ for (const file of files) {
3267
const words = arrayOfWords.length;
3368
totalLines += lines;
3469
totalBytes += bytes;
35-
totalWords +=words
36-
if (countLines && countWords) {
37-
process.stdout.write(` ${lines} ${words} ${file}\n`);
38-
39-
} else if (countLines) {
40-
process.stdout.write(` ${lines} ${file}\n`);
41-
42-
} else if (countWords){
43-
process.stdout.write(` ${words} ${file}\n`);
44-
45-
} else if (countBytes) {
46-
process.stdout.write(` ${bytes} ${file}\n`);
47-
48-
} else {
49-
process.stdout.write(` ${lines} ${words} ${bytes} ${file}\n`);
50-
}
51-
52-
} catch(err) {
53-
console.error(err.message);
54-
}
55-
}
56-
57-
if (files.length > 1 ) {
58-
if (countLines && countWords) {
59-
process.stdout.write(` ${totalLines} ${totalWords} total\n`);
70+
totalWords += words;
71+
printCounts(lines, words, bytes, file);
6072

61-
} else if (countLines) {
62-
process.stdout.write(` ${totalLines} total\n`);
63-
64-
} else if (countWords){
65-
process.stdout.write(` ${totalWords} total\n`);
66-
67-
} else if (countBytes) {
68-
process.stdout.write(` ${totalBytes} total\n`);
69-
70-
} else {
71-
process.stdout.write(` ${totalLines} ${totalWords} ${totalBytes} total\n`);
73+
} catch (err) {
74+
console.error(err.message);
7275
}
7376
}
7477

75-
76-
77-
78-
78+
if (files.length > 1) {
79+
printCounts(
80+
totalLines,
81+
totalWords,
82+
totalBytes,
83+
"total"
84+
);
85+
}

0 commit comments

Comments
 (0)