115 lines
2.9 KiB
Go
115 lines
2.9 KiB
Go
// Package generate The purpose of this package is to ensure that we can extend the use-case of P2PRC.
|
|
// We will create a project directory with the template to extend the use-case of P2PRC
|
|
package generate
|
|
|
|
import (
|
|
"git.sr.ht/~akilan1999/p2p-rendering-computation/config"
|
|
"github.com/otiai10/copy"
|
|
"go/ast"
|
|
"go/token"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
type NewProject struct {
|
|
Name string
|
|
Module string
|
|
NewDir string
|
|
P2PRCPath string
|
|
Option *copy.Options
|
|
Token *token.FileSet
|
|
AST *ast.File
|
|
FileNameAST string
|
|
}
|
|
|
|
// GenerateNewProject creates a new copy of the P2PRC
|
|
// project for custom modification
|
|
func GenerateNewProject(name string, module string) error {
|
|
// Create new variable of type NewProject
|
|
var newProject NewProject
|
|
//Setting module name to the new project
|
|
newProject.Module = module
|
|
// Get path of the current directory
|
|
curDir, err := config.GetCurrentPath()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// Folder name of the new generated project
|
|
newProject.NewDir = curDir + name + "/"
|
|
// Create a new folder based on name entered
|
|
err = CreateFolder(name, curDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// get path of P2PRC
|
|
P2PRCPATH, err := config.GetPathP2PRC()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// Assign P2PRC path to the newly generated project
|
|
newProject.P2PRCPath = P2PRCPATH
|
|
// Steps:
|
|
// - copy all files from P2PRC
|
|
// - remove go.mod and go.sum and create new ones
|
|
|
|
// Files we require to skip
|
|
var Options copy.Options
|
|
|
|
// Skip or have the appropriate files and directories not needed
|
|
Options.Skip = func(src string) (bool, error) {
|
|
switch {
|
|
case strings.HasSuffix(src, "main.go"):
|
|
return false, nil
|
|
case strings.HasSuffix(src, ".go"):
|
|
return true, nil
|
|
case strings.HasSuffix(src, "go.mod"):
|
|
return true, nil
|
|
case strings.HasSuffix(src, "go.sum"):
|
|
return true, nil
|
|
case strings.HasSuffix(src, ".idea"):
|
|
return true, nil
|
|
case strings.HasSuffix(src, "Makefile"):
|
|
return true, nil
|
|
case strings.HasSuffix(src, name):
|
|
return true, nil
|
|
default:
|
|
return false, nil
|
|
}
|
|
}
|
|
|
|
// Storing type option in the struct new project
|
|
newProject.Option = &Options
|
|
|
|
// Copies all files from P2PRC to the new project created
|
|
err = copy.Copy(newProject.P2PRCPath, newProject.NewDir,*newProject.Option)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Creating a new go.mod file in the appropriate directory
|
|
|
|
return nil
|
|
}
|
|
|
|
// CreateFolder Creates a new folder based on the name and path provided
|
|
func CreateFolder(name string,path string) error {
|
|
//Create a folder/directory at a full qualified path
|
|
err := os.Mkdir(path + name, 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CreateGoMod Creates a new go module for the new project created
|
|
func (a *NewProject)CreateGoMod() error {
|
|
// Create new go.mod in the appropriate directory
|
|
cmd := exec.Command("go","mod","init",a.Module)
|
|
cmd.Dir = a.NewDir
|
|
if err := cmd.Start(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|