/
cli.go
136 lines (117 loc) · 2.89 KB
/
cli.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
package aarm
import (
"context"
"flag"
"fmt"
"sort"
"strings"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
)
type keyValuesOptions struct {
m map[string]string
}
func (opt keyValuesOptions) String() string {
keys := make([]string, 0, len(opt.m))
for k := range opt.m {
keys = append(keys, k)
}
sort.Strings(keys)
kv := make([]string, 0, len(opt.m))
for _, k := range keys {
kv = append(kv, k+"="+opt.m[k])
}
return strings.Join(kv, ",")
}
func (opt *keyValuesOptions) Set(s string) error {
if opt.m == nil {
opt.m = map[string]string{}
}
k, v, _ := strings.Cut(s, "=")
opt.m[k] = v
return nil
}
type GlobalOptions struct {
Region string
Profile string
Debug bool
ConfigPath string
ExtStr keyValuesOptions
ExtCode keyValuesOptions
}
func (opts *GlobalOptions) Install(set *flag.FlagSet) {
set.StringVar(&opts.Region, "region", "", "aws region")
set.StringVar(&opts.Profile, "profile", "", "aws profile")
set.BoolVar(&opts.Debug, "debug", false, "debug")
set.StringVar(&opts.ConfigPath, "config-path", "aarm.yml", "config path")
set.Var(&opts.ExtStr, "ext-str", "ext strings")
set.Var(&opts.ExtCode, "ext-code", "ext code")
}
func newAWSConfig(ctx context.Context, opts *GlobalOptions) (aws.Config, error) {
awsOpts := []func(*config.LoadOptions) error{}
if opts.Region != "" {
awsOpts = append(awsOpts, config.WithRegion(opts.Region))
}
if opts.Profile != "" {
awsOpts = append(awsOpts, config.WithSharedConfigProfile(opts.Profile))
}
return config.LoadDefaultConfig(ctx, awsOpts...)
}
func CLI(ctx context.Context, args []string) (int, error) {
if len(args) == 0 {
args = []string{"help"}
}
switch args[0] {
case "init":
set := flag.NewFlagSet("aarm", flag.ExitOnError)
var opts InitOption
opts.Install(set)
set.Parse(args[1:])
app, err := NewApp(ctx, &opts.GlobalOptions)
if err != nil {
return 1, err
}
if err := app.Init(ctx, &opts); err != nil {
return 1, err
}
case "deploy":
set := flag.NewFlagSet("aarm", flag.ExitOnError)
var opts DeployOption
opts.Install(set)
set.Parse(args[1:])
app, err := NewApp(ctx, &opts.GlobalOptions)
if err != nil {
return 1, err
}
if err := app.Deploy(ctx, &opts); err != nil {
return 1, err
}
case "diff":
set := flag.NewFlagSet("aarm", flag.ExitOnError)
var opts DiffOption
opts.Install(set)
set.Parse(args[1:])
app, err := NewApp(ctx, &opts.GlobalOptions)
if err != nil {
return 1, err
}
if err := app.Diff(ctx, &opts); err != nil {
return 1, err
}
case "render":
set := flag.NewFlagSet("aarm", flag.ExitOnError)
var opts RenderOption
opts.Install(set)
set.Parse(args[1:])
app, err := NewApp(ctx, &opts.GlobalOptions)
if err != nil {
return 1, err
}
if err := app.Render(ctx, &opts); err != nil {
return 1, err
}
default:
return 1, fmt.Errorf("unknown sub-command: %s", args[0])
}
return 0, nil
}