Skip to content

Commit e5b978a

Browse files
committed
-backend-framework
1 parent 5bc3105 commit e5b978a

File tree

13 files changed

+91
-97
lines changed

13 files changed

+91
-97
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ gives the option to integrate with one of the more popular backend and fronted f
1414
- Easy to set up and install
1515
- Have the entire Go structure already established
1616
- Setting up a Go HTTP server (or Fasthttp with Fiber)
17+
- Integrates with a popular backend and frontend frameworks
1718
- Focus on the actual code of your application
1819

1920
## Table of Contents
2021

2122
- [Install](#install)
22-
- [Backend Frameworks](#backends)
23+
- [BackendFramework Frameworks](#backends)
2324
- [Database Support](#database-support)
2425
- [Frontend Frameworks](#frontend)
2526
- [Advanced Features](#advanced-features)
@@ -76,7 +77,7 @@ Usage:
7677
Flags:
7778
-a, --advanced Get prompts for advanced features
7879
--feature AdvancedFeatures Advanced feature to use. Allowed values: githubaction, websocket, docker
79-
-b, --backend Backend Backend to use. Allowed values: chi, gin, fiber, gorilla/mux, standard-library, echo
80+
-b, --backend-framework BackendFramework Backend framework to use. Allowed values: chi, gin, fiber, gorilla/mux, standard-library, echo
8081
-d, --driver Database Database drivers to use. Allowed values: mysql, postgres, sqlite, mongo, redis, scylla, none
8182
-f, --frontend Get prompts for frontend frameworks
8283
--frontend-framework Frontendframework Frontend framework to use. Allowed values: htmx, react

cmd/create.go

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ var (
4040
)
4141

4242
func init() {
43-
var flagBackend flags.Backend
43+
var flagBackendFramework flags.BackendFramework
4444
var flagDBDriver flags.Database
4545
var frontendFrameworks flags.FrontendFramework
4646
var frontendAdvanced flags.FrontendAdvanced
@@ -50,7 +50,7 @@ func init() {
5050

5151
// Main flags
5252
createCmd.Flags().StringP("name", "n", "", "Name of project to create")
53-
createCmd.Flags().VarP(&flagBackend, "backend", "b", fmt.Sprintf("Backend to use. Allowed values: %s", strings.Join(flags.AllowedBackedTypes, ", ")))
53+
createCmd.Flags().VarP(&flagBackendFramework, "backend-framework", "b", fmt.Sprintf("Backend framework to use. Allowed values: %s", strings.Join(flags.AllowedBackendFrameworkTypes, ", ")))
5454
createCmd.Flags().VarP(&flagDBDriver, "driver", "d", fmt.Sprintf("Database drivers to use. Allowed values: %s", strings.Join(flags.AllowedDBDrivers, ", ")))
5555
createCmd.Flags().VarP(&flagGit, "git", "g", fmt.Sprintf("Git to use. Allowed values: %s", strings.Join(flags.AllowedGitsOptions, ", ")))
5656

@@ -62,17 +62,11 @@ func init() {
6262
// Advanced features group
6363
createCmd.Flags().BoolP("advanced", "a", false, "Get prompts for advanced features")
6464
createCmd.Flags().Var(&advancedFeatures, "feature", fmt.Sprintf("Advanced feature to use. Allowed values: %s", strings.Join(flags.AllowedAdvancedFeatures, ", ")))
65-
66-
// // Mark dependencies for frontend flags
67-
// createCmd.MarkFlagsRequiredTogether("frontend", "frontend-framework")
68-
//
69-
// // Mark feature flag as requiring --advanced
70-
// createCmd.MarkFlagsRequiredTogether("advanced", "feature")
7165
}
7266

7367
type Options struct {
7468
ProjectName *textinput.Output
75-
ProjectType *multiInput.Selection
69+
BackendFramework *multiInput.Selection
7670
DBDriver *multiInput.Selection
7771
FrontendFramework *multiInput.Selection
7872
FrontendAdvanced *multiSelect.Selection
@@ -106,14 +100,14 @@ var createCmd = &cobra.Command{
106100

107101
// VarP already validates the contents of the framework flag.
108102
// If this flag is filled, it is always valid
109-
flagBackend := flags.Backend(cmd.Flag("backend").Value.String())
103+
flagBackendFramework := flags.BackendFramework(cmd.Flag("backend-framework").Value.String())
110104
flagDBDriver := flags.Database(cmd.Flag("driver").Value.String())
111105
flagFrontendFremwork := flags.FrontendFramework(cmd.Flag("frontend-framework").Value.String())
112106
flagGit := flags.Git(cmd.Flag("git").Value.String())
113107

114108
options := Options{
115109
ProjectName: &textinput.Output{},
116-
ProjectType: &multiInput.Selection{},
110+
BackendFramework: &multiInput.Selection{},
117111
DBDriver: &multiInput.Selection{},
118112
FrontendFramework: &multiInput.Selection{},
119113
FrontendAdvanced: &multiSelect.Selection{
@@ -126,18 +120,18 @@ var createCmd = &cobra.Command{
126120
}
127121

128122
project := &program.Project{
129-
ProjectName: flagName,
130-
ProjectType: flagBackend,
131-
DBDriver: flagDBDriver,
132-
BackendMap: make(map[flags.Backend]program.Backend),
133-
DBDriverMap: make(map[flags.Database]program.Driver),
134-
FrontendFramework: flagFrontendFremwork,
135-
FrontendOptions: make(map[string]bool),
136-
AdvancedOptions: make(map[string]bool),
137-
GitOptions: flagGit,
123+
ProjectName: flagName,
124+
BackendFramework: flagBackendFramework,
125+
DBDriver: flagDBDriver,
126+
BackendFrameworkMap: make(map[flags.BackendFramework]program.BackendFramework),
127+
DBDriverMap: make(map[flags.Database]program.Driver),
128+
FrontendFramework: flagFrontendFremwork,
129+
FrontendOptions: make(map[string]bool),
130+
AdvancedOptions: make(map[string]bool),
131+
GitOptions: flagGit,
138132
}
139133

140-
steps := steps.InitSteps(flagBackend, flagDBDriver, flagFrontendFremwork, flagGit)
134+
steps := steps.InitSteps(flagBackendFramework, flagDBDriver, flagFrontendFremwork, flagGit)
141135
fmt.Printf("%s\n", logoStyle.Render(logo))
142136

143137
// Frontend option steps:
@@ -187,23 +181,23 @@ var createCmd = &cobra.Command{
187181
}
188182
}
189183

190-
if project.ProjectType == "" {
184+
if project.BackendFramework == "" {
191185
isInteractive = true
192-
step := steps.Steps["backend"]
193-
tprogram = tea.NewProgram(multiInput.InitialModelMulti(step.Options, options.ProjectType, step.Headers, project))
186+
step := steps.Steps["backend-framework"]
187+
tprogram = tea.NewProgram(multiInput.InitialModelMulti(step.Options, options.BackendFramework, step.Headers, project))
194188
if _, err := tprogram.Run(); err != nil {
195189
cobra.CheckErr(textinput.CreateErrorInputModel(err).Err())
196190
}
197191
project.ExitCLI(tprogram)
198192

199-
step.Field = options.ProjectType.Choice
193+
step.Field = options.BackendFramework.Choice
200194

201195
// this type casting is always safe since the user interface can
202-
// only pass strings that can be cast to a flags.Backend instance
203-
project.ProjectType = flags.Backend(strings.ToLower(options.ProjectType.Choice))
204-
err := cmd.Flag("backend").Value.Set(project.ProjectType.String())
196+
// only pass strings that can be cast to a flags.BackendFramework instance
197+
project.BackendFramework = flags.BackendFramework(strings.ToLower(options.BackendFramework.Choice))
198+
err := cmd.Flag("backend-framework").Value.Set(project.BackendFramework.String())
205199
if err != nil {
206-
log.Fatal("failed to set the backend flag value", err)
200+
log.Fatal("failed to set the backendFramework flag value", err)
207201
}
208202
}
209203

cmd/flags/backend.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,39 @@ import (
55
"strings"
66
)
77

8-
type Backend string
8+
type BackendFramework string
99

1010
// These are all the current backends supported. If you want to add one, you
1111
// can simply copy and paste a line here. Do not forget to also add it into the
12-
// AllowedBackedTypes slice too!
12+
// AllowedBackendTypes slice too!
1313
const (
14-
Chi Backend = "chi"
15-
Gin Backend = "gin"
16-
Fiber Backend = "fiber"
17-
GorillaMux Backend = "gorilla/mux"
18-
StandardLibrary Backend = "standard-library"
19-
Echo Backend = "echo"
14+
Chi BackendFramework = "chi"
15+
Gin BackendFramework = "gin"
16+
Fiber BackendFramework = "fiber"
17+
GorillaMux BackendFramework = "gorilla/mux"
18+
StandardLibrary BackendFramework = "standard-library"
19+
Echo BackendFramework = "echo"
2020
)
2121

22-
var AllowedBackedTypes = []string{string(Chi), string(Gin), string(Fiber), string(GorillaMux), string(StandardLibrary), string(Echo)}
22+
var AllowedBackendFrameworkTypes = []string{string(Chi), string(Gin), string(Fiber), string(GorillaMux), string(StandardLibrary), string(Echo)}
2323

24-
func (f Backend) String() string {
24+
func (f BackendFramework) String() string {
2525
return string(f)
2626
}
2727

28-
func (f *Backend) Type() string {
29-
return "Backend"
28+
func (f *BackendFramework) Type() string {
29+
return "BackendFramework"
3030
}
3131

32-
func (f *Backend) Set(value string) error {
32+
func (f *BackendFramework) Set(value string) error {
3333
// Contains isn't available in 1.20 yet
34-
// if AllowedBackedTypes.Contains(value) {
35-
for _, project := range AllowedBackedTypes {
34+
// if AllowedBackendTypes.Contains(value) {
35+
for _, project := range AllowedBackendFrameworkTypes {
3636
if project == value {
37-
*f = Backend(value)
37+
*f = BackendFramework(value)
3838
return nil
3939
}
4040
}
4141

42-
return fmt.Errorf("Backend to use. Allowed values: %s", strings.Join(AllowedBackedTypes, ", "))
42+
return fmt.Errorf("BackendFramework to use. Allowed values: %s", strings.Join(AllowedBackendFrameworkTypes, ", "))
4343
}

cmd/program/advanced.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
func (p *Project) CreateWebsocketImports(appDir string) {
1414
websocketDependency := []string{"github.com/coder/websocket"}
15-
if p.ProjectType == flags.Fiber {
15+
if p.BackendFramework == flags.Fiber {
1616
websocketDependency = []string{"github.com/gofiber/contrib/websocket"}
1717
}
1818

@@ -24,7 +24,7 @@ func (p *Project) CreateWebsocketImports(appDir string) {
2424
log.Fatal(err)
2525
}
2626

27-
importsPlaceHolder := string(p.BackendMap[p.ProjectType].templater.WebsocketImports())
27+
importsPlaceHolder := string(p.BackendFrameworkMap[p.BackendFramework].templater.WebsocketImports())
2828

2929
importTmpl, err := template.New("imports").Parse(importsPlaceHolder)
3030
if err != nil {

cmd/program/frontend.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ func (p *Project) CreateHtmxTemplates() {
148148
routesPlaceHolder := ""
149149
importsPlaceHolder := ""
150150
if p.FrontendFramework == flags.Htmx {
151-
routesPlaceHolder += string(p.BackendMap[p.ProjectType].templater.HtmxTemplRoutes())
152-
importsPlaceHolder += string(p.BackendMap[p.ProjectType].templater.HtmxTemplImports())
151+
routesPlaceHolder += string(p.BackendFrameworkMap[p.BackendFramework].templater.HtmxTemplRoutes())
152+
importsPlaceHolder += string(p.BackendFrameworkMap[p.BackendFramework].templater.HtmxTemplImports())
153153
}
154154

155155
routeTmpl, err := template.New("routes").Parse(routesPlaceHolder)

cmd/program/helpers.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ func (p *Project) CreateFileWithInjection(pathToCreate string, projectPath strin
6464

6565
switch methodName {
6666
case "main":
67-
createdTemplate := template.Must(template.New(fileName).Parse(string(p.BackendMap[p.ProjectType].templater.Main())))
67+
createdTemplate := template.Must(template.New(fileName).Parse(string(p.BackendFrameworkMap[p.BackendFramework].templater.Main())))
6868
err = createdTemplate.Execute(createdFile, p)
6969
case "server":
70-
createdTemplate := template.Must(template.New(fileName).Parse(string(p.BackendMap[p.ProjectType].templater.Server())))
70+
createdTemplate := template.Must(template.New(fileName).Parse(string(p.BackendFrameworkMap[p.BackendFramework].templater.Server())))
7171
err = createdTemplate.Execute(createdFile, p)
7272
case "routes":
73-
routeFileBytes := p.BackendMap[p.ProjectType].templater.Routes()
73+
routeFileBytes := p.BackendFrameworkMap[p.BackendFramework].templater.Routes()
7474
createdTemplate := template.Must(template.New(fileName).Parse(string(routeFileBytes)))
7575
err = createdTemplate.Execute(createdFile, p)
7676
case "releaser":
@@ -92,7 +92,7 @@ func (p *Project) CreateFileWithInjection(pathToCreate string, projectPath strin
9292
createdTemplate := template.Must(template.New(fileName).Parse(string(p.DBDriverMap[p.DBDriver].templater.Tests())))
9393
err = createdTemplate.Execute(createdFile, p)
9494
case "tests":
95-
createdTemplate := template.Must(template.New(fileName).Parse(string(p.BackendMap[p.ProjectType].templater.TestHandler())))
95+
createdTemplate := template.Must(template.New(fileName).Parse(string(p.BackendFrameworkMap[p.BackendFramework].templater.TestHandler())))
9696
err = createdTemplate.Execute(createdFile, p)
9797
case "env":
9898
if p.DBDriver != "none" {

cmd/program/program.go

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,22 @@ import (
2323
// A Project contains the data for the project folder
2424
// being created, and methods that help with that process
2525
type Project struct {
26-
ProjectName string
27-
Exit bool
28-
AbsolutePath string
29-
ProjectType flags.Backend
30-
DBDriver flags.Database
31-
Docker flags.Database
32-
FrontendFramework flags.FrontendFramework
33-
BackendMap map[flags.Backend]Backend
34-
DBDriverMap map[flags.Database]Driver
35-
DockerMap map[flags.Database]Docker
36-
FrontendTemplates FrontendTemplates
37-
FrontendOptions map[string]bool
38-
AdvancedTemplates AdvancedTemplates
39-
AdvancedOptions map[string]bool
40-
GitOptions flags.Git
41-
OSCheck map[string]bool
26+
ProjectName string
27+
Exit bool
28+
AbsolutePath string
29+
BackendFramework flags.BackendFramework
30+
DBDriver flags.Database
31+
Docker flags.Database
32+
FrontendFramework flags.FrontendFramework
33+
BackendFrameworkMap map[flags.BackendFramework]BackendFramework
34+
DBDriverMap map[flags.Database]Driver
35+
DockerMap map[flags.Database]Docker
36+
FrontendTemplates FrontendTemplates
37+
FrontendOptions map[string]bool
38+
AdvancedTemplates AdvancedTemplates
39+
AdvancedOptions map[string]bool
40+
GitOptions flags.Git
41+
OSCheck map[string]bool
4242
}
4343

4444
type FrontendTemplates struct {
@@ -51,9 +51,9 @@ type AdvancedTemplates struct {
5151
TemplateImports string
5252
}
5353

54-
// A Backend contains the name and templater for a
55-
// given Backend
56-
type Backend struct {
54+
// A Backend Framework contains the name and templater for a
55+
// given Backend Framework
56+
type BackendFramework struct {
5757
packageName []string
5858
templater Templater
5959
}
@@ -69,7 +69,7 @@ type Docker struct {
6969
}
7070

7171
// A Templater has the methods that help build the files
72-
// in the Project folder, and is specific to a Backend
72+
// in the Project folder, and is specific to a BackendFramework
7373
type Templater interface {
7474
Main() []byte
7575
Server() []byte
@@ -137,34 +137,34 @@ func (p *Project) ExitCLI(tprogram *tea.Program) {
137137
}
138138

139139
// createFrameWorkMap adds the current supported
140-
// Backends into a Project's BackendMap
141-
func (p *Project) createBackendMap() {
142-
p.BackendMap[flags.Chi] = Backend{
140+
// BackendFrameworks into a Project's BackendFrameworkMap
141+
func (p *Project) createBackendFrameworkMap() {
142+
p.BackendFrameworkMap[flags.Chi] = BackendFramework{
143143
packageName: chiPackage,
144144
templater: backend.ChiTemplates{},
145145
}
146146

147-
p.BackendMap[flags.StandardLibrary] = Backend{
147+
p.BackendFrameworkMap[flags.StandardLibrary] = BackendFramework{
148148
packageName: []string{},
149149
templater: backend.StandardLibTemplate{},
150150
}
151151

152-
p.BackendMap[flags.Gin] = Backend{
152+
p.BackendFrameworkMap[flags.Gin] = BackendFramework{
153153
packageName: ginPackage,
154154
templater: backend.GinTemplates{},
155155
}
156156

157-
p.BackendMap[flags.Fiber] = Backend{
157+
p.BackendFrameworkMap[flags.Fiber] = BackendFramework{
158158
packageName: fiberPackage,
159159
templater: backend.FiberTemplates{},
160160
}
161161

162-
p.BackendMap[flags.GorillaMux] = Backend{
162+
p.BackendFrameworkMap[flags.GorillaMux] = BackendFramework{
163163
packageName: gorillaPackage,
164164
templater: backend.GorillaTemplates{},
165165
}
166166

167-
p.BackendMap[flags.Echo] = Backend{
167+
p.BackendFrameworkMap[flags.Echo] = BackendFramework{
168168
packageName: echoPackage,
169169
templater: backend.EchoTemplates{},
170170
}
@@ -254,7 +254,7 @@ func (p *Project) CreateMainFile() error {
254254
p.CheckOS()
255255

256256
// Create the map for our program
257-
p.createBackendMap()
257+
p.createBackendFrameworkMap()
258258

259259
// Create go.mod
260260
err = utils.InitGoMod(p.ProjectName, projectPath)
@@ -264,8 +264,8 @@ func (p *Project) CreateMainFile() error {
264264
}
265265

266266
// Install the correct package for the selected backend
267-
if p.ProjectType != flags.StandardLibrary {
268-
err = utils.GoGetPackage(projectPath, p.BackendMap[p.ProjectType].packageName)
267+
if p.BackendFramework != flags.StandardLibrary {
268+
err = utils.GoGetPackage(projectPath, p.BackendFrameworkMap[p.BackendFramework].packageName)
269269
if err != nil {
270270
log.Printf("Could not install go dependency for the chosen backend %v\n", err)
271271
return err
@@ -505,7 +505,7 @@ func (p *Project) CreateMainFile() error {
505505
}
506506
defer efsFile.Close()
507507

508-
if p.ProjectType == "fiber" {
508+
if p.BackendFramework == "fiber" {
509509
helloGoTemplate := template.Must(template.New("efs").Parse((string(frontend.HelloFiberGoTemplate()))))
510510
err = helloGoTemplate.Execute(helloGoFile, p)
511511
if err != nil {

0 commit comments

Comments
 (0)