Files
tuukoti-cli/maker/project.go
2022-07-22 13:15:26 +01:00

190 lines
2.9 KiB
Go

package maker
import (
"fmt"
"io"
"io/fs"
"os"
"path/filepath"
)
func Project(fs fs.FS, name string) error {
_, err := os.Stat(name)
if err != nil {
if !os.IsNotExist(err) {
return err
}
}
if err == nil {
return fmt.Errorf("project folder already exists")
}
absPath, err := filepath.Abs(name)
if err != nil {
return err
}
err = os.Mkdir(absPath, 0777)
if err != nil {
return fmt.Errorf("failed to create the project folder, %w", err)
}
err = makeProject(fs, absPath, name)
if err != nil {
rerr := os.RemoveAll(absPath)
if rerr != nil {
return rerr
}
return err
}
return nil
}
func makeProject(fs fs.FS, absPath, name string) error {
// check if folder already exists
err := mainfile(fs, absPath, name)
if err != nil {
return err
}
err = defaultHTTPRoutes(fs, absPath)
if err != nil {
return err
}
err = defaultHomepage(fs, absPath)
if err != nil {
return err
}
err = defaultConfig(fs, absPath)
if err != nil {
return err
}
return nil
}
func mainfile(fs fs.FS, path, projectName string) error {
path = filepath.Join(path, "cmd", projectName)
err := os.MkdirAll(path, 0777)
if err != nil {
return err
}
f, err := os.Create(filepath.Join(path, "main.go"))
if err != nil {
return err
}
tmpl, err := fs.Open("templates/main.go")
if err != nil {
return err
}
_, err = io.Copy(f, tmpl)
if err != nil {
return err
}
err = f.Close()
if err != nil {
return err
}
return nil
}
// defaultHTTPRoutes will create a ./http dir with a http.go file.
// In this file we will register 1 route and 2 route handlers.
// The first handle is the home "/" handler.
// The second handler is a 404 handler.
func defaultHTTPRoutes(fs fs.FS, path string) error {
path = filepath.Join(path, "internal", "http")
err := os.MkdirAll(path, 0777)
if err != nil {
return err
}
f, err := os.Create(filepath.Join(path, "http.go"))
if err != nil {
return err
}
tmpl, err := fs.Open("templates/http/http.go")
if err != nil {
return err
}
_, err = io.Copy(f, tmpl)
if err != nil {
return err
}
err = f.Close()
if err != nil {
return err
}
return nil
}
func defaultHomepage(fs fs.FS, path string) error {
err := os.Mkdir(filepath.Join(path, "template"), 0777)
if err != nil {
return err
}
f, err := os.Create(filepath.Join(path, "templates", "index.html"))
if err != nil {
return err
}
tmpl, err := fs.Open("templates/index.html")
if err != nil {
return err
}
_, err = io.Copy(f, tmpl)
if err != nil {
return err
}
err = f.Close()
if err != nil {
return err
}
return nil
}
func defaultConfig(fs fs.FS, path string) error {
f, err := os.Create(filepath.Join(path, "config.yml"))
if err != nil {
return err
}
tmpl, err := fs.Open("templates/config.yml")
if err != nil {
return err
}
_, err = io.Copy(f, tmpl)
if err != nil {
return err
}
err = f.Close()
if err != nil {
return err
}
return nil
}