diff --git a/cmd/internal/base/base.go b/cmd/internal/base/base.go index 05e0e8f1e..4b9b487d7 100644 --- a/cmd/internal/base/base.go +++ b/cmd/internal/base/base.go @@ -83,7 +83,7 @@ func InitCmd() *cobra.Command { }, Run: func(cmd *cobra.Command, names []string) { if err := initEnv(target, names); err != nil { - log.Fatalln(err) + log.Fatalln(fmt.Errorf("ent/init: %w", err)) } }, } @@ -179,16 +179,19 @@ func GenerateCmd(postRun ...func(*gen.Config)) *cobra.Command { // initEnv initialize an environment for ent codegen. func initEnv(target string, names []string) error { if err := createDir(target); err != nil { - return err + return fmt.Errorf("create dir %s: %w", target, err) } for _, name := range names { + if err := gen.ValidSchemaName(name); err != nil { + return fmt.Errorf("init schema %s: %w", name, err) + } b := bytes.NewBuffer(nil) if err := tmpl.Execute(b, name); err != nil { - log.Fatalln(err) + return fmt.Errorf("executing template %s: %w", name, err) } - target := filepath.Join(target, strings.ToLower(name+".go")) - if err := ioutil.WriteFile(target, b.Bytes(), 0644); err != nil { - log.Fatalln(err) + newFileTarget := filepath.Join(target, strings.ToLower(name+".go")) + if err := ioutil.WriteFile(newFileTarget, b.Bytes(), 0644); err != nil { + return fmt.Errorf("writing file %s: %w", newFileTarget, err) } } return nil diff --git a/entc/gen/type.go b/entc/gen/type.go index a96ef34b0..f8bf00812 100644 --- a/entc/gen/type.go +++ b/entc/gen/type.go @@ -186,7 +186,7 @@ func NewType(c *Config, schema *load.Schema) (*Type, error) { fields: make(map[string]*Field, len(schema.Fields)), foreignKeys: make(map[string]struct{}), } - if err := typ.check(); err != nil { + if err := ValidSchemaName(typ.Name); err != nil { return nil, err } for _, f := range schema.Fields { @@ -680,17 +680,20 @@ func (t Type) RelatedTypes() []*Type { return related } -// check checks the schema type. -func (t *Type) check() error { - pkg := t.Package() +// ValidSchemaName will determine if a name is going to conflict with any +// pre-defined names +func ValidSchemaName(name string) error { + // schema package is lower-cased (see Type.Package) + pkg := strings.ToLower(name) + if token.Lookup(pkg).IsKeyword() { return fmt.Errorf("schema lowercase name conflicts with Go keyword %q", pkg) } if types.Universe.Lookup(pkg) != nil { return fmt.Errorf("schema lowercase name conflicts with Go predeclared identifier %q", pkg) } - if _, ok := globalIdent[t.Name]; ok { - return fmt.Errorf("schema name conflicts with ent predeclared identifier %q", t.Name) + if _, ok := globalIdent[name]; ok { + return fmt.Errorf("schema name conflicts with ent predeclared identifier %q", name) } return nil }