github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/internal/plugins/pop/generators/actions/generate.go (about)

     1  package actions
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"html/template"
     7  	"os"
     8  	"path"
     9  	"path/filepath"
    10  
    11  	"github.com/gobuffalo/flect/name"
    12  	"github.com/gobuffalo/here"
    13  	"github.com/gobuffalo/meta/v2"
    14  	"github.com/gobuffalo/plugins"
    15  )
    16  
    17  func (mg *Generator) GenerateResourceActions(ctx context.Context, root string, args []string) error {
    18  	if len(args) == 0 {
    19  		err := fmt.Errorf("you must specify a resource")
    20  		return plugins.Wrap(mg, err)
    21  	}
    22  
    23  	info, err := here.Dir(root)
    24  	if err != nil {
    25  		return plugins.Wrap(mg, err)
    26  	}
    27  
    28  	resourceName := args[0]
    29  
    30  	modelName := mg.modelName
    31  	if len(modelName) == 0 {
    32  		modelName = resourceName
    33  	}
    34  
    35  	modelsPkg := mg.modelsPkg
    36  	if len(modelsPkg) == 0 {
    37  		modelsPkg = path.Join(info.ImportPath, "models")
    38  	}
    39  
    40  	modelsPkgSel := mg.modelsPkgSel
    41  	importName := modelsPkgSel
    42  	if len(modelsPkgSel) == 0 {
    43  		modelsPkgSel = path.Base(modelsPkg)
    44  		importName = ""
    45  	}
    46  
    47  	app, err := meta.New(info)
    48  	if err != nil {
    49  		return plugins.Wrap(mg, err)
    50  	}
    51  
    52  	pres := struct {
    53  		AsWeb        bool
    54  		ImportName   string
    55  		Model        name.Ident
    56  		ModelsPkg    string
    57  		ModelsPkgSel string
    58  		Name         name.Ident
    59  	}{
    60  		AsWeb:        app.As["web"],
    61  		ImportName:   importName,
    62  		Model:        name.New(modelName),
    63  		ModelsPkg:    modelsPkg,
    64  		ModelsPkgSel: modelsPkgSel,
    65  		Name:         name.New(resourceName),
    66  	}
    67  
    68  	t, err := template.New(resourceName).Parse(actionsTmpl)
    69  	if err != nil {
    70  		return plugins.Wrap(mg, err)
    71  	}
    72  
    73  	p := fmt.Sprintf("%s.go", pres.Name.Folder().Pluralize())
    74  	fp := filepath.Join(root, "actions", p)
    75  
    76  	if err := os.MkdirAll(filepath.Dir(fp), 0755); err != nil {
    77  		return plugins.Wrap(mg, err)
    78  	}
    79  
    80  	f, err := os.Create(fp)
    81  	if err != nil {
    82  		return plugins.Wrap(mg, err)
    83  	}
    84  	defer f.Close()
    85  
    86  	if err := t.Execute(f, pres); err != nil {
    87  		return plugins.Wrap(mg, err)
    88  	}
    89  
    90  	return nil
    91  }