Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/river/token/builder/token.go
4096 views
1
package builder
2
3
import (
4
"bytes"
5
"io"
6
7
"github.com/grafana/agent/pkg/river/parser"
8
"github.com/grafana/agent/pkg/river/printer"
9
"github.com/grafana/agent/pkg/river/token"
10
)
11
12
// A Token is a wrapper around token.Token which contains the token type
13
// alongside its literal. Use LiteralTok as the Tok field to write literal
14
// characters such as whitespace.
15
type Token struct {
16
Tok token.Token
17
Lit string
18
}
19
20
// printFileTokens prints out the tokens as River text and formats them, writing
21
// the final result to w.
22
func printFileTokens(w io.Writer, toks []Token) (int, error) {
23
var raw bytes.Buffer
24
for _, tok := range toks {
25
switch {
26
case tok.Tok == token.LITERAL:
27
raw.WriteString(tok.Lit)
28
case tok.Tok == token.COMMENT:
29
raw.WriteString(tok.Lit)
30
case tok.Tok.IsLiteral() || tok.Tok.IsKeyword():
31
raw.WriteString(tok.Lit)
32
default:
33
raw.WriteString(tok.Tok.String())
34
}
35
}
36
37
f, err := parser.ParseFile("", raw.Bytes())
38
if err != nil {
39
return 0, err
40
}
41
42
wc := &writerCount{w: w}
43
err = printer.Fprint(wc, f)
44
return wc.n, err
45
}
46
47
// printExprTokens prints out the tokens as River text and formats them,
48
// writing the final result to w.
49
func printExprTokens(w io.Writer, toks []Token) (int, error) {
50
var raw bytes.Buffer
51
for _, tok := range toks {
52
switch {
53
case tok.Tok == token.LITERAL:
54
raw.WriteString(tok.Lit)
55
case tok.Tok.IsLiteral() || tok.Tok.IsKeyword():
56
raw.WriteString(tok.Lit)
57
default:
58
raw.WriteString(tok.Tok.String())
59
}
60
}
61
62
expr, err := parser.ParseExpression(raw.String())
63
if err != nil {
64
return 0, err
65
}
66
67
wc := &writerCount{w: w}
68
err = printer.Fprint(wc, expr)
69
return wc.n, err
70
}
71
72
type writerCount struct {
73
w io.Writer
74
n int
75
}
76
77
func (wc *writerCount) Write(p []byte) (n int, err error) {
78
n, err = wc.w.Write(p)
79
wc.n += n
80
return
81
}
82
83