Skip to content

Commit 643b9f0

Browse files
committed
Refactor to separate packages
Fix linter errors
1 parent b1f5e0f commit 643b9f0

File tree

11 files changed

+146
-68
lines changed

11 files changed

+146
-68
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@
77
!.vscode/tasks.json
88
!.vscode/launch.json
99
!.vscode/extensions.json
10+
terraform-variables-generator

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## (Unreleased)
2+
3+
ENHANCEMENTS:
4+
* Optimize project structure, split to separate packages and add cobra for cli

cmd/cmd.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/spf13/cobra"
8+
9+
log "github.com/sirupsen/logrus"
10+
11+
"github.com/alexandrst88/terraform-variables-generator/pkg/generator"
12+
"github.com/alexandrst88/terraform-variables-generator/pkg/utils"
13+
)
14+
15+
const (
16+
tfFileExt = "*.tf"
17+
)
18+
19+
var (
20+
generatorVersion string
21+
22+
vars bool
23+
varsFile string
24+
)
25+
26+
// Execute will run main logic
27+
func Execute(version string) {
28+
generatorVersion = version
29+
30+
cmd := &cobra.Command{
31+
Use: "generator",
32+
Short: "CLI for generating terraform variables",
33+
Example: " terraform-variable-generator",
34+
Version: generatorVersion,
35+
Run: runGenerator,
36+
}
37+
38+
cmd.PersistentFlags().BoolVar(&vars, "vars", true, "generate variables")
39+
cmd.PersistentFlags().StringVar(&varsFile, "vars-file", "./variables.tf", "path to generated variables file")
40+
41+
if err := cmd.Execute(); err != nil {
42+
fmt.Println(err)
43+
os.Exit(1)
44+
}
45+
os.Exit(0)
46+
}
47+
48+
func runGenerator(cmd *cobra.Command, args []string) {
49+
if vars {
50+
if utils.FileExists(varsFile) {
51+
utils.UserPromt(varsFile)
52+
}
53+
54+
tfFiles, err := utils.GetAllFiles(tfFileExt)
55+
utils.CheckError(err)
56+
if len(tfFiles) == 0 {
57+
log.Warn("No terraform files to proceed, exiting")
58+
return
59+
}
60+
61+
generator.GenerateVars(tfFiles, varsFile)
62+
}
63+
}

helpers.go

-37
This file was deleted.

main.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package main
2+
3+
import "github.com/alexandrst88/terraform-variables-generator/cmd"
4+
5+
// Version is updated by linker flags during build time
6+
var Version = "dev"
7+
8+
func main() {
9+
cmd.Execute(Version)
10+
}
File renamed without changes.

terraform.go renamed to pkg/generator/terraform.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package main
1+
package generator
22

33
import (
44
"regexp"
55
"sort"
66
"strings"
7+
8+
"github.com/alexandrst88/terraform-variables-generator/pkg/utils"
79
)
810

911
type terraformVars struct {
@@ -16,13 +18,13 @@ func (t *terraformVars) matchVarPref(row, varPrefix string) {
1618
match := pattern.FindAllStringSubmatch(row, -1)
1719
for _, m := range match {
1820
res := replacer.Replace(m[0])
19-
if !containsElement(t.Variables, res) {
21+
if !utils.ContainsElement(t.Variables, res) {
2022
t.Variables = append(t.Variables, res)
2123
}
2224
}
2325
}
2426
}
2527

2628
func (t *terraformVars) sortVars() {
27-
sort.Sort(sort.StringSlice(t.Variables))
29+
sort.Strings(t.Variables)
2830
}

generator.go renamed to pkg/generator/vars.go

+7-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package main
1+
package generator
22

33
import (
44
"bufio"
@@ -8,13 +8,13 @@ import (
88
"sync"
99

1010
log "github.com/sirupsen/logrus"
11+
12+
"github.com/alexandrst88/terraform-variables-generator/pkg/utils"
1113
)
1214

1315
var replacer *strings.Replacer
1416
var varPrefix = "var."
15-
var tfFileExt = "*.tf"
1617

17-
var dstFile = "./variables.tf"
1818
var varTemplate = template.Must(template.New("var_file").Parse(`{{range .}}
1919
variable "{{ . }}" {
2020
description = ""
@@ -35,17 +35,9 @@ func init() {
3535
" ", "",
3636
)
3737
}
38-
func main() {
39-
if fileExists(dstFile) {
40-
userPromt()
41-
}
4238

43-
tfFiles, err := getAllFiles(tfFileExt)
44-
if len(tfFiles) == 0 {
45-
log.Warn("No terraform files to proceed, exiting")
46-
os.Exit(0)
47-
}
48-
checkError(err)
39+
// GenerateVars will write generated vars to file
40+
func GenerateVars(tfFiles []string, dstFile string) {
4941
var wg sync.WaitGroup
5042
messages := make(chan string)
5143
wg.Add(len(tfFiles))
@@ -69,11 +61,10 @@ func main() {
6961
}()
7062
wg.Wait()
7163
f, err := os.Create(dstFile)
72-
checkError(err)
64+
utils.CheckError(err)
7365

7466
t.sortVars()
7567
err = varTemplate.Execute(f, t.Variables)
76-
checkError(err)
68+
utils.CheckError(err)
7769
log.Infof("Variables are generated to %q file", dstFile)
78-
7970
}

generator_test.go renamed to pkg/generator/vars_test.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
package main
1+
package generator
22

33
import (
44
"bufio"
55
"os"
66
"testing"
7+
8+
"github.com/alexandrst88/terraform-variables-generator/pkg/utils"
79
)
810

9-
var mockFile = "tf_configuration.mock"
1011
var testExtFile = "*.mock"
1112

1213
func TestContainsElement(t *testing.T) {
1314
testSlice := []string{"Terraform", "Puppet", "Ansible"}
14-
if containsElement(testSlice, "Chef") {
15+
if utils.ContainsElement(testSlice, "Chef") {
1516
t.Error("Should return false, but return true")
1617
}
1718
}
1819

1920
func TestGetAllFiles(t *testing.T) {
20-
files, err := getAllFiles(testExtFile)
21-
checkError(err)
21+
files, err := utils.GetAllFiles(testExtFile)
22+
utils.CheckError(err)
2223
if len(files) == 0 {
2324
t.Error("Should found at least one file")
2425
}
@@ -28,8 +29,8 @@ func TestMatchVariable(t *testing.T) {
2829
ter := &terraformVars{}
2930
var messages []string
3031

31-
file, err := getAllFiles(testExtFile)
32-
checkError(err)
32+
file, err := utils.GetAllFiles(testExtFile)
33+
utils.CheckError(err)
3334

3435
fileHandle, _ := os.Open(file[0])
3536
defer fileHandle.Close()

file_utils.go renamed to pkg/utils/file_utils.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package main
1+
package utils
22

33
import (
44
"os"
@@ -7,21 +7,24 @@ import (
77
log "github.com/sirupsen/logrus"
88
)
99

10-
func getAllFiles(ext string) ([]string, error) {
10+
// GetAllFiles will get all files in current directory
11+
func GetAllFiles(ext string) ([]string, error) {
1112
dir, err := os.Getwd()
12-
checkError(err)
13+
CheckError(err)
14+
1315
var files []string
1416
log.Infof("Finding files in %q directory", dir)
1517
files, err = filepath.Glob(ext)
16-
checkError(err)
18+
CheckError(err)
1719

1820
if len(files) == 0 {
1921
log.Infof("No files with %q extensions found in %q", ext, dir)
2022
}
2123
return files, nil
2224
}
2325

24-
func fileExists(name string) bool {
26+
// FileExists checks if file exists
27+
func FileExists(name string) bool {
2528
if _, err := os.Stat(name); err == nil {
2629
return true
2730
}

pkg/utils/helpers.go

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package utils
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
log "github.com/sirupsen/logrus"
8+
)
9+
10+
// CheckError is a convenient wrapper for error check
11+
func CheckError(e error) {
12+
if e != nil {
13+
log.Fatal(e)
14+
}
15+
}
16+
17+
// ContainsElement check if slice of strings contains provided string
18+
func ContainsElement(slice []string, value string) bool {
19+
if len(slice) == 0 {
20+
return false
21+
}
22+
for _, s := range slice {
23+
if value == s {
24+
return true
25+
}
26+
}
27+
return false
28+
}
29+
30+
// UserPromt will ask user if file needs to be overridden
31+
func UserPromt(dstFile string) {
32+
var response string
33+
log.Warnf("File %q already exists, type 'yes' if you want replace it", dstFile)
34+
fmt.Print("-> ")
35+
_, err := fmt.Scanln(&response)
36+
CheckError(err)
37+
if response != "yes" {
38+
os.Exit(0)
39+
}
40+
}

0 commit comments

Comments
 (0)