Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 114 additions & 10 deletions bootstrap/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package bootstrap
import (
"fmt"
"os"
"path/filepath"
"text/template"

"gofr.dev/pkg/gofr"
Expand All @@ -18,20 +19,88 @@ require gofr.dev v{{ .GofrVersion }}
mainContent = `package main

import (
"{{ .Module }}/handler"

"gofr.dev/pkg/gofr"
)

func main() {
app := gofr.New()

app.GET("/hello", func(ctx *gofr.Context) (any, error) {
return "Hello World!", nil
})
h := handler.New()

app.GET("/hello", h.Hello)

app.Run()
}
`
fileMode = 0644
handlerContent = `package handler

import (
"{{ .Module }}/service"

"gofr.dev/pkg/gofr"
)

type Handler struct {
Service *service.Service
}

func New() *Handler {
return &Handler{
Service: service.New(),
}
}

func (h *Handler) Hello(ctx *gofr.Context) (any, error) {
msg, err := h.Service.Hello(ctx)
if err != nil {
return nil, err
}

return msg, nil
}
`
serviceContent = `package service

import (
"{{ .Module }}/store"

"gofr.dev/pkg/gofr"
)

type Service struct {
Store *store.Store
}

func New() *Service {
return &Service{
Store: store.New(),
}
}

func (s *Service) Hello(ctx *gofr.Context) (string, error) {
return s.Store.Hello(ctx)
}
`
storeContent = `package store

import (
"gofr.dev/pkg/gofr"
)

type Store struct{}

func New() *Store {
return &Store{}
}

func (s *Store) Hello(ctx *gofr.Context) (string, error) {
return "Hello from Store!", nil
}
`
fileMode = 0644
dirFileMode = 0755
)

type modInfo struct {
Expand All @@ -47,6 +116,20 @@ func Create(ctx *gofr.Context) (any, error) {
gofrVersion = "1.17.0"
}

info := modInfo{Module: name, GofrVersion: gofrVersion}

if err := os.MkdirAll("handler", dirFileMode); err != nil {
return nil, err
}

if err := os.MkdirAll("service", dirFileMode); err != nil {
return nil, err
}

if err := os.MkdirAll("store", dirFileMode); err != nil {
return nil, err
}

modFile, err := os.OpenFile("go.mod", os.O_CREATE|os.O_WRONLY, fileMode)
if err != nil {
return nil, err
Expand All @@ -57,22 +140,43 @@ func Create(ctx *gofr.Context) (any, error) {
return nil, err
}

err = t.Execute(modFile, modInfo{Module: name, GofrVersion: gofrVersion})
err = t.Execute(modFile, info)
if err != nil {
return nil, err
}

fmt.Println("Note: Please do go mod tidy to sync the dependencies of your project")

mainFile, err := os.OpenFile("main.go", os.O_CREATE|os.O_WRONLY, fileMode)
if err != nil {
if err := writeTemplateFile("main.go", mainContent, info); err != nil {
return nil, err
}

_, err = mainFile.WriteString(mainContent)
if err != nil {
if err := writeTemplateFile(filepath.Join("handler", "handler.go"), handlerContent, info); err != nil {
return nil, err
}

if err := writeTemplateFile(filepath.Join("service", "service.go"), serviceContent, info); err != nil {
return nil, err
}

if err := writeTemplateFile(filepath.Join("store", "store.go"), storeContent, info); err != nil {
return nil, err
}

return "Successfully initialized project " + name, nil
return "Successfully initialized project " + name + " with three-layer architecture (handler, service, store)", nil
}

func writeTemplateFile(path, content string, info modInfo) error {
t, err := template.New(filepath.Base(path)).Parse(content)
if err != nil {
return err
}

f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, fileMode)
if err != nil {
return err
}
defer f.Close()

return t.Execute(f, info)
}