Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/tools/riverfmt/main.go
4093 views
1
package main
2
3
import (
4
"bytes"
5
"errors"
6
"flag"
7
"fmt"
8
"io"
9
"os"
10
11
"github.com/grafana/agent/pkg/river/diag"
12
"github.com/grafana/agent/pkg/river/parser"
13
"github.com/grafana/agent/pkg/river/printer"
14
)
15
16
func main() {
17
err := run()
18
19
var diags diag.Diagnostics
20
if errors.As(err, &diags) {
21
for _, diag := range diags {
22
fmt.Fprintln(os.Stderr, diag)
23
}
24
os.Exit(1)
25
} else if err != nil {
26
fmt.Fprintf(os.Stderr, "error: %s\n", err)
27
os.Exit(1)
28
}
29
}
30
31
func run() error {
32
var (
33
write bool
34
)
35
36
fs := flag.NewFlagSet("riverfmt", flag.ExitOnError)
37
fs.BoolVar(&write, "w", write, "write result to (source) file instead of stdout")
38
39
if err := fs.Parse(os.Args[1:]); err != nil {
40
return err
41
}
42
43
args := fs.Args()
44
switch len(args) {
45
case 0:
46
if write {
47
return fmt.Errorf("cannot use -w with standard input")
48
}
49
return format("<stdin>", nil, os.Stdin, write)
50
51
case 1:
52
fi, err := os.Stat(args[0])
53
if err != nil {
54
return err
55
}
56
if fi.IsDir() {
57
return fmt.Errorf("cannot format a directory")
58
}
59
f, err := os.Open(args[0])
60
if err != nil {
61
return err
62
}
63
defer f.Close()
64
return format(args[0], fi, f, write)
65
66
default:
67
return fmt.Errorf("can only format one file")
68
}
69
}
70
71
func format(filename string, fi os.FileInfo, r io.Reader, write bool) error {
72
bb, err := io.ReadAll(r)
73
if err != nil {
74
return err
75
}
76
77
f, err := parser.ParseFile(filename, bb)
78
if err != nil {
79
return err
80
}
81
82
var buf bytes.Buffer
83
if err := printer.Fprint(&buf, f); err != nil {
84
return err
85
}
86
87
// Add a newline at the end
88
_, _ = buf.Write([]byte{'\n'})
89
90
if !write {
91
_, err := io.Copy(os.Stdout, &buf)
92
return err
93
}
94
95
wf, err := os.OpenFile(filename, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, fi.Mode().Perm())
96
if err != nil {
97
return err
98
}
99
defer wf.Close()
100
101
_, err = io.Copy(wf, &buf)
102
return err
103
}
104
105