blob: d79810bd6f1e989c1e9d647a78e6a6a888dfe491 [file] [log] [blame]
// A command-line application to create a new custom element of the given name
// in the directory 'modules'.
//
//go:generate rm -rf modules/example-control-sk
//go:generate go run main.go example-control-sk example-app-name
//
package main
import (
"io"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
"strings"
"text/template"
rice "github.com/GeertJohan/go.rice"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/util"
)
const (
modulesDirectory = "modules"
)
func exists(filename string) bool {
if _, err := os.Stat(filename); err == nil {
return true
} else if os.IsNotExist(err) {
return false
}
return true
}
// new returns an http.FileSystem with all the templates.
func new() (http.FileSystem, error) {
conf := rice.Config{
LocateOrder: []rice.LocateMethod{rice.LocateFS, rice.LocateEmbedded},
}
box, err := conf.FindBox("templates")
if err != nil {
return nil, skerr.Wrap(err)
}
return box.HTTPBox(), nil
}
func main() {
if len(os.Args) != 3 {
log.Fatalf(`Usage: new_element name-of-element app-name
Creates a new custom element of the given name in the directory:
modules/name-of-element
Will not overwrite existing files.
`)
}
fs, err := new()
if err != nil {
log.Fatal(err)
}
// Make sure 'modules' directory exists.
if _, err := os.Stat(modulesDirectory); err != nil && os.IsNotExist(err) {
log.Fatalf("The %q directory doesn't exist.", modulesDirectory)
}
elementName := os.Args[1]
appName := os.Args[2]
files := map[string]string{
"file-demo.html": filepath.Join(modulesDirectory, elementName, elementName+"-demo.html"),
"file-demo.ts": filepath.Join(modulesDirectory, elementName, elementName+"-demo.ts"),
"file.ts": filepath.Join(modulesDirectory, elementName, elementName+".ts"),
"file_test.ts": filepath.Join(modulesDirectory, elementName, elementName+"_test.ts"),
"file_puppeteer_test.ts": filepath.Join(modulesDirectory, elementName, elementName+"_puppeteer_test.ts"),
"file.scss": filepath.Join(modulesDirectory, elementName, elementName+".scss"),
"index.ts": filepath.Join(modulesDirectory, elementName, "index.ts"),
}
// Convert the element name, "some-element-sk", into a class name, "SomeElementSk".
parts := strings.Split(elementName, "-")
for i, part := range parts {
parts[i] = strings.Title(part)
}
className := strings.Join(parts, "")
// Create directory for the element. Will fail if the directory already exists.
if err := os.Mkdir(filepath.Join(modulesDirectory, elementName), 0755); err != nil {
log.Fatalf("Failed to create element directory: %s", err)
}
context := map[string]string{
"ElementName": elementName,
"ClassName": className,
"AppName": appName,
}
// Write each file.
for filename, target := range files {
// Load and parse the template.
file, err := fs.Open(filename)
if err != nil {
log.Fatal(err)
}
b, err := ioutil.ReadAll(file)
if err != nil {
log.Fatal(err)
}
t := template.New(filename)
if _, err := t.Parse(string(b)); err != nil {
log.Fatal(err)
}
// Use the parsed template to create the file.
err = util.WithWriteFile(target, func(w io.Writer) error {
return t.ExecuteTemplate(w, filename, context)
})
if err != nil {
log.Fatalf("Failed to write %q: %s", target, err)
}
}
}