/
main.go
131 lines (106 loc) · 2.53 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"github.com/fatih/color"
"github.com/jessevdk/go-flags"
)
const (
appName = "gols"
appVersion = "0.10"
appUsage = "[options][file...]"
appDiscription = "unix ls command for golang"
)
type exitCode int
const (
exitCodeOK exitCode = iota
exitCodeErrArgs
exitCodeErrLs
)
type options struct {
Version bool `short:"v" long:"version" description:"Show version"`
Recerse bool `short:"r" long:"recurse" description:"recurse"`
Path string `short:"p" long:"path" default:"./" description:"path"`
}
func main() {
code, err := run(os.Args[1:])
if err != nil {
fmt.Fprintf(os.Stderr, "[ERROR] %s\n", err)
}
os.Exit(int(code))
}
func run(cliantArgs []string) (exitCode, error) {
var opts options
parser := flags.NewParser(&opts, flags.Default)
parser.Name = appName
parser.Usage = appUsage
parser.ShortDescription = appDiscription
parser.LongDescription = appDiscription
_, err := parser.ParseArgs(cliantArgs)
if err != nil {
if flags.WroteHelp(err) {
return exitCodeOK, nil
}
return exitCodeErrArgs, fmt.Errorf("parse error:%w", err)
}
if opts.Version {
fmt.Fprintf(os.Stdout, "%s: v%s\n", appName, appVersion)
return exitCodeOK, nil
}
var dir string = opts.Path
fmt.Println(dir)
if dir == "./" {
dir, err = os.Getwd()
if err != nil {
return exitCodeErrLs, errors.New("error ls getwd")
}
}
// ls実行
// 本当は文字列を吐き出すだけにして後のフィルタリング処理を実行したほうが良いかもしれん
if opts.Recerse {
code, err := recurseLs(dir)
if err != nil {
return code, err
}
} else {
code, err := ls(dir)
if err != nil {
return code, err
}
}
//フィルタリング処理
//TODO:気が向いたら書く
return exitCodeOK, nil
}
//再帰表示
func recurseLs(dir string) (exitCode, error) {
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
printFileInfo(info)
return nil
})
if err != nil {
return exitCodeErrLs, err
}
return exitCodeOK, nil
}
func ls(dir string) (exitCode, error) {
fileInfos, err := ioutil.ReadDir(dir)
if err != nil {
return exitCodeErrLs, errors.New("error read dir")
}
for _, info := range fileInfos {
printFileInfo(info)
}
return exitCodeOK, nil
}
func printFileInfo(info os.FileInfo) {
fmt.Printf("%v %s\n",
color.New(color.FgHiYellow, color.Bold).Sprintf("%v", info.Mode()),
color.New(color.FgHiWhite, color.Bold).Sprintf("%v", info.Name()))
}