Files
ent/entc/gen/template/builder/create.tmpl
Ariel Mashraki 1ebfa489c5 ent: add support for enum types
Summary: Pull Request resolved: https://github.com/facebookincubator/ent/pull/45

Reviewed By: alexsn

Differential Revision: D17715085

fbshipit-source-id: 7472e1bd9cf7a8a5bd98f96e6e884c0e27f36803
2019-10-02 12:55:28 -07:00

98 lines
3.0 KiB
Cheetah

{{/*
Copyright 2019-present Facebook Inc. All rights reserved.
This source code is licensed under the Apache 2.0 license found
in the LICENSE file in the root directory of this source tree.
*/}}
{{ define "create" }}
{{ $pkg := base $.Config.Package }}
{{ template "header" $ }}
{{ template "import" $ }}
{{ $builder := print (pascal $.Name) "Create" }}
{{ $receiver := receiver $builder }}
// {{ $builder }} is the builder for creating a {{ $.Name }} entity.
type {{ $builder }} struct {
config
{{ range $_, $f := $.Fields }}
{{- $f.StructField }} *{{ $f.Type }}
{{ end }}
{{- range $_, $e := $.Edges }}
{{- $e.StructField }} map[{{ $.ID.Type }}]struct{}
{{ end -}}
}
{{ with extend $ "Builder" $builder }}
{{ template "setter" . }}
{{ end }}
// Save creates the {{ $.Name }} in the database.
func ({{ $receiver }} *{{ $builder }}) Save(ctx context.Context) (*{{ $.Name }}, error) {
{{ range $_, $f := $.Fields -}}
{{- if or $f.Default (not $f.Optional) -}}
if {{ $receiver }}.{{ $f.StructField }} == nil {
{{ if $f.Default -}}
v := {{ $.Package }}.{{ $f.DefaultName }}{{ if $f.IsTime }}(){{ end }}
{{ $receiver }}.{{ $f.StructField }} = &v
{{ else -}}
return nil, errors.New("{{ $pkg }}: missing required field \"{{ $f.Name }}\"")
{{ end -}}
}
{{ end -}}
{{ with or $f.Validators $f.IsEnum -}}
{{/* add nullable check only for optional fields without default value */ -}}
{{ $nullable := and $f.Optional (not $f.Default) -}}
{{- if $nullable }} if {{ $receiver }}.{{ $f.StructField }} != nil { {{ end -}}
if err := {{ $.Package }}.{{ $f.Validator }}(*{{ $receiver }}.{{ $f.StructField }}); err != nil {
return nil, fmt.Errorf("{{ $pkg }}: validator failed for field \"{{ $f.Name }}\": %v", err)
}
{{- if $nullable }} } {{ end }}
{{ end -}}
{{ end -}}
{{- range $_, $e := $.Edges }}
{{- if $e.Unique -}}
if len({{ $receiver }}.{{ $e.StructField }}) > 1 {
return nil, errors.New("{{ $pkg }}: multiple assignments on a unique edge \"{{ $e.Name }}\"")
}
{{ end -}}
{{- if not $e.Optional -}}
if {{ $receiver }}.{{ $e.StructField }} == nil {
return nil, errors.New("{{ $pkg }}: missing required edge \"{{ $e.Name }}\"")
}
{{ end -}}
{{ end -}}
{{- if gt (len $.Storage) 1 -}}
switch {{ $receiver }}.driver.Dialect() {
{{- range $_, $storage := $.Storage }}
case {{ join $storage.Dialects ", " }}:
return {{ $receiver }}.{{ $storage }}Save(ctx)
{{- end }}
default:
return nil, errors.New("{{ $pkg }}: unsupported dialect")
}
{{- else -}}
return {{ $receiver }}.{{ index $.Storage 0 }}Save(ctx)
{{- end }}
}
// SaveX calls Save and panics if Save returns an error.
func ({{ $receiver }} *{{ $builder }}) SaveX(ctx context.Context) *{{ $.Name }} {
v, err := {{ $receiver }}.Save(ctx)
if err != nil {
panic(err)
}
return v
}
{{- range $_, $storage := $.Storage }}
{{ with extend $ "Builder" $builder }}
{{ $tmpl := printf "dialect/%s/create" $storage }}
{{ xtemplate $tmpl . }}
{{ end }}
{{ end }}
{{ end }}