forked from webrpc/ridlfmt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
129 lines (104 loc) · 2.84 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
package main
import (
"bufio"
"bytes"
"flag"
"fmt"
"log"
"os"
"github.com/webrpc/ridlfmt/formatter"
)
func main() {
flag.Usage = usage
sortErrorsFlag := flag.Bool("s", false, "sort errors by code")
writeFlag := flag.Bool("w", false, "write output to input file (overwrites the file)")
helpFlag := flag.Bool("h", false, "show help")
flag.Parse()
args := flag.Args()
if *helpFlag {
flag.Usage()
os.Exit(0)
}
if len(args) == 0 && !isInputFromPipe() {
fmt.Fprintln(os.Stderr, "error: no input files specified")
flag.Usage()
os.Exit(1)
}
if *writeFlag {
for _, fileName := range args {
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 args {
err := formatAndPrintToStdout(fileName, *sortErrorsFlag)
if err != nil {
log.Fatalf("Error processing file %s: %v", fileName, err)
}
}
}
}
}
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
`)
}