Generate the package and apply the template

This commit is contained in:
Zac Garby 2017-08-31 23:15:56 +01:00
parent a2279925d3
commit cf3041ed2d

View File

@ -3,6 +3,7 @@ package operators
import (
"bufio"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
@ -28,8 +29,6 @@ func Generate() error {
return err
}
fmt.Println(opts)
pwd, err := filepath.Abs(".")
if err != nil {
return err
@ -37,6 +36,8 @@ func Generate() error {
dir := filepath.Join(pwd, opts.title)
fmt.Println()
_, err = git.PlainClone(dir, false, &git.CloneOptions{
URL: "https://github.com/pluto-language/package-template",
Progress: os.Stdout,
@ -51,6 +52,13 @@ func Generate() error {
return err
}
err = applyOptionsToTemplate(dir, opts)
if err != nil {
return err
}
fmt.Printf("\nPackage '%s' has been created!\n", opts.title)
return nil
}
@ -58,27 +66,27 @@ func promptOptions() (*genOpts, error) {
reader := bufio.NewReader(os.Stdin)
colour := color.New(color.Bold)
title, err := promptOption("package title:", reader, colour)
title, err := promptOption("package title", reader, colour)
if err != nil {
return nil, err
}
display, err := promptOption("display name:", reader, colour)
display, err := promptOption("display name", reader, colour)
if err != nil {
return nil, err
}
description, err := promptOption("description:", reader, colour)
description, err := promptOption("description", reader, colour)
if err != nil {
return nil, err
}
author, err := promptOption("author:", reader, colour)
author, err := promptOption("author", reader, colour)
if err != nil {
return nil, err
}
version, err := promptOption("version:", reader, colour)
version, err := promptOption("version", reader, colour)
if err != nil {
return nil, err
}
@ -93,7 +101,7 @@ func promptOptions() (*genOpts, error) {
}
func promptOption(msg string, reader *bufio.Reader, colour *color.Color) (string, error) {
colour.Printf("%15s ", msg)
colour.Printf("%15s: ", msg)
text, err := reader.ReadString('\n')
if err != nil {
@ -102,3 +110,71 @@ func promptOption(msg string, reader *bufio.Reader, colour *color.Color) (string
return strings.TrimSpace(text), nil
}
func applyOptionsToTemplate(dir string, opts *genOpts) error {
files, err := ioutil.ReadDir(dir)
if err != nil {
return err
}
for _, file := range files {
if file.Name() == ".git" {
continue
}
path := filepath.Join(dir, file.Name())
if file.IsDir() {
err = applyOptionsToTemplate(path, opts)
if err != nil {
return err
}
} else {
var (
name = file.Name()
newname = applyOptions(name, opts)
newpath = filepath.Join(dir, newname)
)
err = os.Rename(path, newpath)
if err != nil {
return err
}
handle, err := os.Open(newpath)
if err != nil {
return err
}
data, err := ioutil.ReadAll(handle)
if err != nil {
return err
}
newstr := applyOptions(string(data), opts)
err = ioutil.WriteFile(newpath, []byte(newstr), 0644)
if err != nil {
return err
}
}
}
return nil
}
func applyOptions(str string, opts *genOpts) string {
replacements := map[string]string{
"%title": opts.title,
"%display": opts.display,
"%description": opts.description,
"%author": opts.author,
"%version": opts.version,
}
for temp, opt := range replacements {
str = strings.Replace(str, temp, opt, -1)
}
return str
}