-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
140 lines (113 loc) · 3.16 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
132
133
134
135
136
137
138
139
140
package main
import (
"bufio"
"bytes"
"flag"
"fmt"
"log"
"os"
"github.com/webrpc/ridlfmt/formatter"
)
func main() {
flagSet := flag.NewFlagSet("ridlfmt", flag.ExitOnError)
if err := runRidlfmt(flagSet, os.Args[1:]); err != nil {
log.Fatalf("Error: %v", err)
}
}
func runRidlfmt(flagSet *flag.FlagSet, args []string) error {
flag.Usage = usage
sortErrorsFlag := flagSet.Bool("s", false, "sort errors by code")
writeFlag := flagSet.Bool("w", false, "write output to input file (overwrites the file)")
helpFlag := flagSet.Bool("h", false, "show help")
if err := flagSet.Parse(args); err != nil {
return fmt.Errorf("parse args: %w", err)
}
if *helpFlag {
flag.Usage()
os.Exit(0)
}
fileArgs := flagSet.Args()
if len(fileArgs) == 0 && !isInputFromPipe() {
fmt.Fprintln(os.Stderr, "error: no input files specified")
flag.Usage()
os.Exit(1)
}
if *writeFlag {
for _, fileName := range fileArgs {
err := formatAndWriteToFile(fileName, *sortErrorsFlag)
if err != nil {
log.Fatalf("Error processing file %s: %v", fileName, err)
}
}
} else {
if isInputFromPipe() {
err := formatAndPrintFromPipe(*sortErrorsFlag)
if err != nil {
log.Fatalf("Error processing input from pipe: %v", err)
}
} else {
for _, fileName := range fileArgs {
err := formatAndPrintToStdout(fileName, *sortErrorsFlag)
if err != nil {
log.Fatalf("Error processing file %s: %v", fileName, err)
}
}
}
}
return nil
}
func isInputFromPipe() bool {
stat, _ := os.Stdin.Stat()
return (stat.Mode() & os.ModeCharDevice) == 0
}
func formatAndWriteToFile(fileName string, sortErrorsFlag bool) error {
inputBytes, err := os.ReadFile(fileName)
if err != nil {
return fmt.Errorf("error opening input file %s: %w", fileName, err)
}
output, err := formatter.Format(bytes.NewReader(inputBytes), sortErrorsFlag)
if err != nil {
return fmt.Errorf("error formatting input file %s: %w", fileName, err)
}
err = os.WriteFile(fileName, []byte(output), 0644)
if err != nil {
return fmt.Errorf("error writing to output file %s: %w", fileName, err)
}
return nil
}
func formatAndPrintToStdout(fileName string, sortErrorsFlag bool) error {
inputBytes, err := os.ReadFile(fileName)
if err != nil {
return fmt.Errorf("error opening input file %s: %w", fileName, err)
}
output, err := formatter.Format(bytes.NewReader(inputBytes), sortErrorsFlag)
if err != nil {
return fmt.Errorf("error formatting input file %s: %w", fileName, err)
}
fmt.Println(output)
return nil
}
func formatAndPrintFromPipe(sortErrorsFlag bool) error {
scanner := bufio.NewScanner(os.Stdin)
var inputBuffer bytes.Buffer
for scanner.Scan() {
inputBuffer.WriteString(scanner.Text())
inputBuffer.WriteByte('\n')
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("error reading from pipe: %w", err)
}
output, err := formatter.Format(&inputBuffer, sortErrorsFlag)
if err != nil {
return fmt.Errorf("error formatting input from pipe: %w", err)
}
fmt.Println(output)
return nil
}
func usage() {
fmt.Fprintf(os.Stderr, `usage: ridlfmt [flags] [path...]
-h show help
-s sort errors by code
-w write result to (source) file instead of stdout
`)
}