From 4b2e52ef8bb526abf6d70e80abd93bc160417b2f Mon Sep 17 00:00:00 2001 From: thoriqadillah Date: Sat, 16 Dec 2023 20:40:39 +0700 Subject: [PATCH 1/6] leftover log package --- go.mod | 10 +++++++++- go.sum | 10 ++++++++++ slick/cmd.go | 37 +++++++++++++++++++++++++++++++++++++ slick/main.go | 1 + 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 slick/cmd.go diff --git a/go.mod b/go.mod index fae664a..8c051ac 100644 --- a/go.mod +++ b/go.mod @@ -7,4 +7,12 @@ require ( github.com/julienschmidt/httprouter v1.3.0 ) -require github.com/joho/godotenv v1.5.1 +require ( + github.com/joho/godotenv v1.5.1 + github.com/spf13/cobra v1.8.0 +) + +require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect +) diff --git a/go.sum b/go.sum index 1a163ab..642ebf6 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,18 @@ github.com/a-h/templ v0.2.476 h1:+H4hP4CwK4kfJwXsE6kHeFWMGtcVOVoOm/I64uzARBk= github.com/a-h/templ v0.2.476/go.mod h1:zQ95mSyadNTGHv6k5Fm+wQU8zkBMMbHCHg7eAvUZKNM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/slick/cmd.go b/slick/cmd.go new file mode 100644 index 0000000..e3123e3 --- /dev/null +++ b/slick/cmd.go @@ -0,0 +1,37 @@ +package main + +import ( + "github.com/spf13/cobra" +) + +type commandFunc func() *cobra.Command + +type cli struct { + cmds []commandFunc +} + +func NewCommand() *cli { + return &cli{ + cmds: make([]commandFunc, 0), + } +} + +func (c *cli) Register(cmds ...commandFunc) { + for _, cmd := range cmds { + c.cmds = append(c.cmds, cmd) + } +} + +func (c *cli) Execute() { + rootCmd := &cobra.Command{ + Use: "slick", + Short: "Slick CLI", + Long: "Slick web framework", + } + + for _, command := range c.cmds { + rootCmd.AddCommand(command()) + } + + rootCmd.Execute() +} diff --git a/slick/main.go b/slick/main.go index 2c8ff83..20f7182 100644 --- a/slick/main.go +++ b/slick/main.go @@ -130,6 +130,7 @@ func writeMainContents(mod string) []byte { package main import ( + "log" "github.com/anthdm/slick" "%s/handler" ) From 340ff5a08270d1dc3c7b272e3c3f40acb73d2c3c Mon Sep 17 00:00:00 2001 From: thoriqadillah Date: Sat, 16 Dec 2023 20:50:22 +0700 Subject: [PATCH 2/6] refactor the cli for easier command addition --- go.mod | 9 +-- slick/cmd.go | 4 +- slick/main.go | 198 +++++++++++++++++++++++++++----------------------- 3 files changed, 112 insertions(+), 99 deletions(-) diff --git a/go.mod b/go.mod index 8c051ac..17aab5d 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,13 @@ module github.com/anthdm/slick -go 1.21.0 +go 1.21 require ( github.com/a-h/templ v0.2.476 github.com/julienschmidt/httprouter v1.3.0 -) - -require ( github.com/joho/godotenv v1.5.1 github.com/spf13/cobra v1.8.0 -) - -require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect ) + diff --git a/slick/cmd.go b/slick/cmd.go index e3123e3..194e03e 100644 --- a/slick/cmd.go +++ b/slick/cmd.go @@ -17,9 +17,7 @@ func NewCommand() *cli { } func (c *cli) Register(cmds ...commandFunc) { - for _, cmd := range cmds { - c.cmds = append(c.cmds, cmd) - } + c.cmds = append(c.cmds, cmds...) } func (c *cli) Execute() { diff --git a/slick/main.go b/slick/main.go index 20f7182..d12f14c 100644 --- a/slick/main.go +++ b/slick/main.go @@ -6,6 +6,8 @@ import ( "os/exec" "strings" "time" + + "github.com/spf13/cobra" ) func usage() { @@ -14,103 +16,121 @@ func usage() { } func main() { - args := os.Args - if len(args) < 2 { - usage() - } - cmd := os.Args[1] - - switch cmd { - case "run": - if _, err := os.Stat("cmd/main.go"); err != nil { - fmt.Println("not in slick app root: cmd/main.go not found") - os.Exit(1) - } - if err := exec.Command("templ", "generate").Run(); err != nil { - fmt.Println(err) - os.Exit(1) - } - exec.Command("go", "run", "cmd/main.go").Run() - case "install": - if err := installProject(); err != nil { - fmt.Println(err) - } - case "new": - if len(os.Args) != 3 { - usage() - } - name := os.Args[2] - if err := generateProject(name); err != nil { - fmt.Println(err) - } - } + command := NewCommand() + command.Register( + runProject, + installProject, + generateProject, + ) + + command.Execute() } -func generateProject(name string) error { - fmt.Println("creating new slick project:", name) - if err := os.Mkdir(name, os.ModePerm); err != nil { - return err - } - - folders := []string{"model", "handler", "view", "cmd", "public"} - - for _, folder := range folders { - if err := os.Mkdir(name+"/"+folder, os.ModePerm); err != nil { - return err - } +func runProject() *cobra.Command { + return &cobra.Command{ + Use: "run", + Example: "slick run", + Short: "Run slick development server", + Run: func(cmd *cobra.Command, args []string) { + if _, err := os.Stat("cmd/main.go"); err != nil { + fmt.Println("not in slick app root: cmd/main.go not found") + os.Exit(1) + } + if err := exec.Command("templ", "generate").Run(); err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := exec.Command("go", "run", "cmd/main.go").Run(); err != nil { + fmt.Println(err) + } + }, } +} - if err := os.WriteFile(name+"/go.mod", writeGoModContents(name), os.ModePerm); err != nil { - return err - } - if err := os.WriteFile(name+"/.air.toml", writeAirTomlContents(), os.ModePerm); err != nil { - return err - } - if err := os.WriteFile(name+"/.env", writeEnvFileContents(), os.ModePerm); err != nil { - return err - } - if err := os.WriteFile(name+"/.gitignore", writeGitignore(), os.ModePerm); err != nil { - return err +func installProject() *cobra.Command { + return &cobra.Command{ + Use: "install", + Example: "slick install", + Short: "Install project's dependency", + Run: func(cmd *cobra.Command, args []string) { + start := time.Now() + fmt.Println("installing project...") + if err := exec.Command("go", "get", "github.com/anthdm/slick@latest").Run(); err != nil { + fmt.Println(err) + return + } + + if err := exec.Command("go", "get", "github.com/a-h/templ").Run(); err != nil { + fmt.Println(err) + return + } + if err := exec.Command("templ", "generate").Run(); err != nil { + fmt.Println(err) + return + } + + fmt.Printf("done installing project in %v\n", time.Since(start)) + }, } - if err := os.WriteFile(name+"/public/app.css", []byte(""), os.ModePerm); err != nil { - return err - } - if err := os.WriteFile(name+"/cmd/main.go", writeMainContents(name), os.ModePerm); err != nil { - return err - } - if err := os.WriteFile(name+"/handler/hello.go", writeHandlerContent(name), os.ModePerm); err != nil { - return err - } - if err := os.Mkdir(name+"/view/hello", os.ModePerm); err != nil { - return err - } - if err := os.Mkdir(name+"/view/layout", os.ModePerm); err != nil { - return err - } - if err := os.WriteFile(name+"/view/layout/base.templ", writeBaseLayoutContent(), os.ModePerm); err != nil { - return err - } - if err := os.WriteFile(name+"/view/hello/hello.templ", writeViewContent(name), os.ModePerm); err != nil { - return err - } - - return nil } -func installProject() error { - start := time.Now() - fmt.Println("installing project...") - if err := exec.Command("go", "get", "github.com/anthdm/slick@latest").Run(); err != nil { - return err - } - if err := exec.Command("go", "get", "github.com/a-h/templ").Run(); err != nil { - return err - } - if err := exec.Command("templ", "generate").Run(); err != nil { - return err +func generateProject() *cobra.Command { + return &cobra.Command{ + Use: "new", + Example: "slick new hello-world", + Short: "Create new slick project", + Run: func(cmd *cobra.Command, args []string) { + name := args[0] + + fmt.Println("creating new slick project:", name) + if err := os.Mkdir(name, os.ModePerm); err != nil { + fmt.Println(err) + } + + folders := []string{"model", "handler", "view", "cmd", "public"} + + for _, folder := range folders { + if err := os.Mkdir(name+"/"+folder, os.ModePerm); err != nil { + fmt.Println(err) + } + } + + if err := os.WriteFile(name+"/go.mod", writeGoModContents(name), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/.air.toml", writeAirTomlContents(), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/.env", writeEnvFileContents(), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/.gitignore", writeGitignore(), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/public/app.css", []byte(""), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/cmd/main.go", writeMainContents(name), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/handler/hello.go", writeHandlerContent(name), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.Mkdir(name+"/view/hello", os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.Mkdir(name+"/view/layout", os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/view/layout/base.templ", writeBaseLayoutContent(), os.ModePerm); err != nil { + fmt.Println(err) + } + if err := os.WriteFile(name+"/view/hello/hello.templ", writeViewContent(name), os.ModePerm); err != nil { + fmt.Println(err) + } + }, } - fmt.Printf("done installing project in %v\n", time.Since(start)) - return nil } func writeEnvFileContents() []byte { From 9b8404f5e0bcbeee4b68513259a212c0c17a539b Mon Sep 17 00:00:00 2001 From: thoriqadillah Date: Sat, 16 Dec 2023 21:56:09 +0700 Subject: [PATCH 3/6] add new base command --- slick/main.go | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/slick/main.go b/slick/main.go index d12f14c..61017db 100644 --- a/slick/main.go +++ b/slick/main.go @@ -10,17 +10,15 @@ import ( "github.com/spf13/cobra" ) -func usage() { - fmt.Println("help....") - os.Exit(0) -} - func main() { command := NewCommand() command.Register( runProject, installProject, generateProject, + generateModel, + generateView, + generateHandler, ) command.Execute() @@ -34,11 +32,11 @@ func runProject() *cobra.Command { Run: func(cmd *cobra.Command, args []string) { if _, err := os.Stat("cmd/main.go"); err != nil { fmt.Println("not in slick app root: cmd/main.go not found") - os.Exit(1) + return } if err := exec.Command("templ", "generate").Run(); err != nil { fmt.Println(err) - os.Exit(1) + return } if err := exec.Command("go", "run", "cmd/main.go").Run(); err != nil { @@ -86,6 +84,7 @@ func generateProject() *cobra.Command { fmt.Println("creating new slick project:", name) if err := os.Mkdir(name, os.ModePerm); err != nil { fmt.Println(err) + return } folders := []string{"model", "handler", "view", "cmd", "public"} @@ -133,6 +132,41 @@ func generateProject() *cobra.Command { } } +func generateModel() *cobra.Command { + return &cobra.Command{ + Use: "model", + Example: "slick model user", + Short: "Generate new model", + Run: func(cmd *cobra.Command, args []string) { + // TODO: + }, + } +} + +func generateView() *cobra.Command { + return &cobra.Command{ + Use: "model", + Example: "slick model user", + Short: "Generate new model", + Run: func(cmd *cobra.Command, args []string) { + // TODO: + + }, + } +} + +func generateHandler() *cobra.Command { + return &cobra.Command{ + Use: "handler", + Example: "slick handler home", + Short: "Generate new handler", + Run: func(cmd *cobra.Command, args []string) { + // TODO: + + }, + } +} + func writeEnvFileContents() []byte { return []byte(` SLICK_HTTP_LISTEN_ADDR=:3000 From 19e7f55db957d2c989be7d0a9616cbe70d52a846 Mon Sep 17 00:00:00 2001 From: thoriqadillah Date: Sat, 16 Dec 2023 22:04:15 +0700 Subject: [PATCH 4/6] chore: renaming variable --- slick/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slick/main.go b/slick/main.go index 61017db..81ef2af 100644 --- a/slick/main.go +++ b/slick/main.go @@ -11,8 +11,8 @@ import ( ) func main() { - command := NewCommand() - command.Register( + cmd := NewCommand() + cmd.Register( runProject, installProject, generateProject, @@ -21,7 +21,7 @@ func main() { generateHandler, ) - command.Execute() + cmd.Execute() } func runProject() *cobra.Command { From 9ee5ee81c7d26d191c1313ba7846ca88551aa257 Mon Sep 17 00:00:00 2001 From: thoriqadillah Date: Sat, 16 Dec 2023 22:17:49 +0700 Subject: [PATCH 5/6] chore: typo --- slick/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slick/main.go b/slick/main.go index 81ef2af..bf713da 100644 --- a/slick/main.go +++ b/slick/main.go @@ -145,9 +145,9 @@ func generateModel() *cobra.Command { func generateView() *cobra.Command { return &cobra.Command{ - Use: "model", - Example: "slick model user", - Short: "Generate new model", + Use: "view", + Example: "slick view user", + Short: "Generate new view", Run: func(cmd *cobra.Command, args []string) { // TODO: From 4b0e2a10ca05a706bb15e6f1721c551aada8c773 Mon Sep 17 00:00:00 2001 From: thoriqadillah Date: Sat, 16 Dec 2023 22:23:41 +0700 Subject: [PATCH 6/6] chore: add more todo --- slick/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slick/main.go b/slick/main.go index bf713da..d4b2b38 100644 --- a/slick/main.go +++ b/slick/main.go @@ -49,6 +49,7 @@ func runProject() *cobra.Command { func installProject() *cobra.Command { return &cobra.Command{ Use: "install", + Aliases: []string{"i"}, Example: "slick install", Short: "Install project's dependency", Run: func(cmd *cobra.Command, args []string) { @@ -95,6 +96,7 @@ func generateProject() *cobra.Command { } } + // TODO: imrpove this error handling if err := os.WriteFile(name+"/go.mod", writeGoModContents(name), os.ModePerm); err != nil { fmt.Println(err) }