/
insert.go
72 lines (65 loc) · 1.76 KB
/
insert.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
package output
import (
"errors"
"fmt"
"github.com/aquaproj/aqua/pkg/config/aqua"
"github.com/goccy/go-yaml"
"github.com/goccy/go-yaml/ast"
"github.com/goccy/go-yaml/parser"
"github.com/spf13/afero"
)
func (out *Outputter) generateInsert(cfgFilePath string, pkgs []*aqua.Package) error {
b, err := afero.ReadFile(out.fs, cfgFilePath)
if err != nil {
return fmt.Errorf("read a configuration file: %w", err)
}
file, err := parser.ParseBytes(b, parser.ParseComments)
if err != nil {
return fmt.Errorf("parse configuration file as YAML: %w", err)
}
if err := updateASTFile(file, pkgs); err != nil {
return err
}
stat, err := out.fs.Stat(cfgFilePath)
if err != nil {
return fmt.Errorf("get configuration file stat: %w", err)
}
if err := afero.WriteFile(out.fs, cfgFilePath, []byte(file.String()+"\n"), stat.Mode()); err != nil {
return fmt.Errorf("write the configuration file: %w", err)
}
return nil
}
func updateASTFile(file *ast.File, pkgs []*aqua.Package) error { //nolint:cyclop
node, err := yaml.ValueToNode(pkgs)
if err != nil {
return fmt.Errorf("convert packages to node: %w", err)
}
for _, doc := range file.Docs {
var values []*ast.MappingValueNode
switch body := doc.Body.(type) {
case *ast.MappingNode:
values = body.Values
case *ast.MappingValueNode:
values = append(values, body)
default:
continue
}
for _, mapValue := range values {
if mapValue.Key.String() != "packages" {
continue
}
switch mapValue.Value.Type() {
case ast.NullType:
mapValue.Value = node
case ast.SequenceType:
if err := ast.Merge(mapValue.Value, node); err != nil {
return fmt.Errorf("merge packages: %w", err)
}
default:
return errors.New("packages must be null or array")
}
break
}
}
return nil
}