1package cmd
2
3import (
4	"fmt"
5	"os"
6	"text/template"
7
8	"github.com/spf13/cobra/cobra/tpl"
9)
10
11// Project contains name, license and paths to projects.
12type Project struct {
13	// v2
14	PkgName      string
15	Copyright    string
16	AbsolutePath string
17	Legal        License
18	Viper        bool
19	AppName      string
20}
21
22type Command struct {
23	CmdName   string
24	CmdParent string
25	*Project
26}
27
28func (p *Project) Create() error {
29	// check if AbsolutePath exists
30	if _, err := os.Stat(p.AbsolutePath); os.IsNotExist(err) {
31		// create directory
32		if err := os.Mkdir(p.AbsolutePath, 0754); err != nil {
33			return err
34		}
35	}
36
37	// create main.go
38	mainFile, err := os.Create(fmt.Sprintf("%s/main.go", p.AbsolutePath))
39	if err != nil {
40		return err
41	}
42	defer mainFile.Close()
43
44	mainTemplate := template.Must(template.New("main").Parse(string(tpl.MainTemplate())))
45	err = mainTemplate.Execute(mainFile, p)
46	if err != nil {
47		return err
48	}
49
50	// create cmd/root.go
51	if _, err = os.Stat(fmt.Sprintf("%s/cmd", p.AbsolutePath)); os.IsNotExist(err) {
52		os.Mkdir(fmt.Sprintf("%s/cmd", p.AbsolutePath), 0751)
53	}
54	rootFile, err := os.Create(fmt.Sprintf("%s/cmd/root.go", p.AbsolutePath))
55	if err != nil {
56		return err
57	}
58	defer rootFile.Close()
59
60	rootTemplate := template.Must(template.New("root").Parse(string(tpl.RootTemplate())))
61	err = rootTemplate.Execute(rootFile, p)
62	if err != nil {
63		return err
64	}
65
66	// create license
67	return p.createLicenseFile()
68}
69
70func (p *Project) createLicenseFile() error {
71	data := map[string]interface{}{
72		"copyright": copyrightLine(),
73	}
74	licenseFile, err := os.Create(fmt.Sprintf("%s/LICENSE", p.AbsolutePath))
75	if err != nil {
76		return err
77	}
78	defer licenseFile.Close()
79
80	licenseTemplate := template.Must(template.New("license").Parse(p.Legal.Text))
81	return licenseTemplate.Execute(licenseFile, data)
82}
83
84func (c *Command) Create() error {
85	cmdFile, err := os.Create(fmt.Sprintf("%s/cmd/%s.go", c.AbsolutePath, c.CmdName))
86	if err != nil {
87		return err
88	}
89	defer cmdFile.Close()
90
91	commandTemplate := template.Must(template.New("sub").Parse(string(tpl.AddCommandTemplate())))
92	err = commandTemplate.Execute(cmdFile, c)
93	if err != nil {
94		return err
95	}
96	return nil
97}
98