Skip to content

Commit e5e6539

Browse files
authored
Merge pull request #2 from b4b4r07/create-config
By default, won't let it create the config
2 parents 752d2bd + d20cc28 commit e5e6539

File tree

2 files changed

+57
-44
lines changed

2 files changed

+57
-44
lines changed

config.go

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,20 @@ const (
2121
envCurlCommand = "IAP_CURL_BIN"
2222
)
2323

24+
// Config represents
2425
type Config struct {
2526
Services []Service `json:"services"`
2627

2728
path string
2829
}
2930

31+
// Service is the URL and its Env pair
3032
type Service struct {
3133
URL string `json:"url"`
3234
Env Env `json:"env"`
3335
}
3436

37+
// Env represents the environment variables needed to request to IAP-protected app
3538
type Env struct {
3639
Credentials string `json:"GOOGLE_APPLICATION_CREDENTIALS"`
3740
ClientID string `json:"IAP_CLIENT_ID"`
@@ -60,21 +63,16 @@ func configDir() (string, error) {
6063
return dir, nil
6164
}
6265

63-
func (cfg *Config) LoadFile(file string) error {
64-
cfg.path = file
65-
_, err := os.Stat(file)
66+
// Create creates config file if it doesn't exist
67+
func (cfg *Config) Create() error {
68+
_, err := os.Stat(cfg.path)
6669
if err == nil {
67-
raw, _ := ioutil.ReadFile(file)
68-
if err := json.Unmarshal(raw, cfg); err != nil {
69-
return err
70-
}
7170
return nil
7271
}
73-
7472
if !os.IsNotExist(err) {
7573
return err
7674
}
77-
f, err := os.Create(file)
75+
f, err := os.Create(cfg.path)
7876
if err != nil {
7977
return err
8078
}
@@ -91,7 +89,22 @@ func (cfg *Config) LoadFile(file string) error {
9189
}}
9290
}
9391

94-
return json.NewEncoder(f).Encode(cfg)
92+
enc := json.NewEncoder(f)
93+
enc.SetIndent("", " ")
94+
return enc.Encode(cfg)
95+
}
96+
97+
// Load loads config file to struct
98+
func (cfg *Config) Load() error {
99+
dir, _ := configDir()
100+
file := filepath.Join(dir, "config.json")
101+
cfg.path = file
102+
_, err := os.Stat(cfg.path)
103+
if err != nil {
104+
return err
105+
}
106+
raw, _ := ioutil.ReadFile(cfg.path)
107+
return json.Unmarshal(raw, cfg)
95108
}
96109

97110
func (cfg *Config) getEnvFromFile(url string) (env Env, err error) {
@@ -106,6 +119,7 @@ func (cfg *Config) getEnvFromFile(url string) (env Env, err error) {
106119
return
107120
}
108121

122+
// GetEnv returns Env includes url
109123
func (cfg *Config) GetEnv(url string) (env Env, err error) {
110124
env, _ = cfg.getEnvFromFile(url)
111125
credentials := os.Getenv(envCredentials)
@@ -136,21 +150,25 @@ func (cfg *Config) GetEnv(url string) (env Env, err error) {
136150
}, nil
137151
}
138152

153+
// GetURLs returns URLs described in config file
139154
func (cfg *Config) GetURLs() (list []string) {
140155
for _, service := range cfg.Services {
141156
list = append(list, service.URL)
142157
}
143158
return
144159
}
145160

161+
// Edit edits config file
162+
// If it doesn't exist, it will be automatically created
146163
func (cfg *Config) Edit() error {
147-
dir, _ := configDir()
148-
json := filepath.Join(dir, "config.json")
164+
if err := cfg.Create(); err != nil {
165+
return err
166+
}
149167
editor := os.Getenv("EDITOR")
150168
if editor == "" {
151169
editor = "vim"
152170
}
153-
command := fmt.Sprintf("%s %s", editor, json)
171+
command := fmt.Sprintf("%s %s", editor, cfg.path)
154172
var cmd *exec.Cmd
155173
if runtime.GOOS == "windows" {
156174
cmd = exec.Command("cmd", "/c", command)
@@ -163,6 +181,7 @@ func (cfg *Config) Edit() error {
163181
return cmd.Run()
164182
}
165183

184+
// Registered returns true if url exists in config file
166185
func (cfg *Config) Registered(url string) bool {
167186
u1, _ := neturl.Parse(url)
168187
for _, service := range cfg.Services {
@@ -174,6 +193,7 @@ func (cfg *Config) Registered(url string) bool {
174193
return false
175194
}
176195

196+
// Register registers service to config file
177197
func (cfg *Config) Register(s Service) error {
178198
cfg.Services = append(cfg.Services, s)
179199
b, err := json.Marshal(cfg)
@@ -184,7 +204,10 @@ func (cfg *Config) Register(s Service) error {
184204
if err := json.Indent(&out, b, "", " "); err != nil {
185205
return err
186206
}
187-
file, _ := os.OpenFile(cfg.path, os.O_WRONLY, 0644)
207+
file, err := os.OpenFile(cfg.path, os.O_WRONLY, 0644)
208+
if err != nil {
209+
return err
210+
}
188211
w := bufio.NewWriter(file)
189212
w.Write(out.Bytes())
190213
return w.Flush()

main.go

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"net/url"
88
"os"
99
"os/exec"
10-
"path/filepath"
1110
"runtime"
1211
"strings"
1312
)
@@ -41,40 +40,37 @@ type CLI struct {
4140
}
4241

4342
type option struct {
44-
list bool
45-
edit bool
46-
47-
help bool
4843
version bool
44+
help bool
45+
list bool
46+
edit bool
4947
}
5048

5149
func main() {
52-
cli, err := newCLI(os.Args[1:])
53-
if err != nil {
54-
panic(err)
55-
}
56-
os.Exit(cli.run())
50+
os.Exit(newCLI(os.Args[1:]).run())
5751
}
5852

59-
func newCLI(args []string) (CLI, error) {
53+
func newCLI(args []string) CLI {
6054
var c CLI
6155

62-
// TODO: make it customizable
6356
c.stdout = os.Stdout
6457
c.stderr = os.Stderr
6558

59+
// Do not handle error
60+
c.cfg.Load()
61+
6662
for _, arg := range args {
6763
switch arg {
64+
case "--help":
65+
c.opt.help = true
66+
case "--version":
67+
c.opt.version = true
6868
case "--list", "--list-urls":
6969
c.opt.list = true
7070
case "--edit", "--edit-config":
7171
c.opt.edit = true
72-
case "--version":
73-
c.opt.version = true
74-
case "--help":
75-
c.opt.help = true
7672
default:
77-
u, err := url.Parse(arg)
73+
u, err := url.ParseRequestURI(arg)
7874
if err == nil {
7975
c.urls = append(c.urls, *u)
8076
} else {
@@ -83,27 +79,21 @@ func newCLI(args []string) (CLI, error) {
8379
}
8480
}
8581

86-
dir, _ := configDir()
87-
json := filepath.Join(dir, "config.json")
88-
if err := c.cfg.LoadFile(json); err != nil {
89-
return c, err
90-
}
91-
92-
return c, nil
82+
return c
9383
}
9484

9585
func (c CLI) exit(msg interface{}) int {
9686
switch m := msg.(type) {
87+
case int:
88+
return m
89+
case nil:
90+
return 0
9791
case string:
9892
fmt.Fprintf(c.stdout, "%s\n", m)
9993
return 0
10094
case error:
10195
fmt.Fprintf(c.stderr, "[ERROR] %s: %s\n", app, m.Error())
10296
return 1
103-
case int:
104-
return m
105-
case nil:
106-
return 0
10797
default:
10898
panic(msg)
10999
}
@@ -154,8 +144,8 @@ func (c CLI) run() int {
154144

155145
authHeader := fmt.Sprintf("'Authorization: Bearer %s'", token)
156146
args := append(
157-
[]string{"-H", authHeader}, // For IAP header
158-
c.args..., // Original args
147+
[]string{"-H", authHeader}, // For IAP
148+
c.args...,
159149
)
160150
args = append(args, url)
161151

0 commit comments

Comments
 (0)