Skip to content

Commit 2b331b7

Browse files
committed
added error handling, filtering and more changes
1 parent 1b14d59 commit 2b331b7

1 file changed

Lines changed: 54 additions & 32 deletions

File tree

implement-shell-tools/ls/my-ls.js

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,81 @@
1-
#!/usr/bin/env node
1+
#!/usr/bin/env node
22

33
const fs = require("node:fs");
44
const path = require("node:path");
55

6+
function main() {
7+
const args = process.argv.slice(2);
8+
9+
const {
10+
showAll,
11+
onePerLine,
12+
targetDir,
13+
unknownFlags
14+
} = parseArgs(args);
15+
16+
if (unknownFlags.length > 0) {
17+
console.error(
18+
`warning: unknown option(s): ${unknownFlags.join(", ")}`
19+
);
20+
}
21+
22+
let files = readDirectory(targetDir);
23+
24+
files = applyFilters(files, showAll);
25+
files = sortFiles(files);
26+
27+
const output = render(files, onePerLine);
28+
29+
console.log(output);
30+
}
31+
32+
main();
33+
634
function parseArgs(args) {
735
let showAll = false;
36+
let onePerLine = false;
837
let targetDir = ".";
38+
const unknownFlags = [];
39+
40+
const knownFlags = new Set(["-a", "-1"]);
941

1042
for (const arg of args) {
11-
if (arg === "-a") {
12-
showAll = true;
13-
} else if (!arg.startsWith("-")) {
43+
if (knownFlags.has(arg)) {
44+
if (arg === "-a") showAll = true;
45+
if (arg === "-1") onePerLine = true;
46+
} else if (arg.startsWith("-")) {
47+
unknownFlags.push(arg);
48+
} else {
1449
targetDir = arg;
1550
}
1651
}
1752

18-
return { showAll, targetDir };
53+
return { showAll, onePerLine, targetDir, unknownFlags };
1954
}
2055

21-
function listDirectory(dirPath, showAll) {
22-
let files = fs.readdirSync(dirPath);
23-
24-
let hidden = [];
25-
let normal = files;
56+
function readDirectory(dir) {
57+
return fs.readdirSync(dir);
58+
}
2659

60+
function applyFilters(files, showAll) {
2761
if (!showAll) {
28-
normal = files.filter(file => !file.startsWith("."));
29-
} else {
30-
hidden = files.filter(file => file.startsWith("."));
31-
normal = files.filter(file => !file.startsWith("."));
32-
62+
return files.filter(f => !f.startsWith("."));
3363
}
3464

35-
normal.sort();
36-
hidden.sort();
37-
38-
let result = [];
39-
40-
if (showAll) {
41-
result.push(".","..");
65+
return [".", "..", ...files];
4266
}
43-
result.push (...normal, ...hidden);
44-
45-
return result;
46-
67+
function sortFiles(files) {
68+
return files.sort();
4769
}
4870

49-
function main() {
50-
const args = process.argv.slice(2);
51-
const { showAll, targetDir } = parseArgs(args);
71+
function render(files, onePerLine) {
72+
if (onePerLine) {
73+
return files.join("\n");
74+
}
5275

53-
const files = listDirectory(targetDir, showAll);
54-
console.log(files.join("\n"));
76+
// default format (simple column simulation)
77+
return files.join(" ");
5578
}
5679

57-
main();
5880

5981

0 commit comments

Comments
 (0)