Files
ent/entc/gen/template/builder/create.tmpl
2020-04-18 12:28:50 +03:00

108 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" $ }}
import (
{{- range $path := $.SiblingImports }}
"{{ $path }}"
{{- end }}
)
{{ $builder := print (pascal $.Name) "Create" }}
{{ $receiver := receiver $builder }}
// {{ $builder }} is the builder for creating a {{ $.Name }} entity.
type {{ $builder }} struct {
config
mutation *{{ $.MutationName }}
hooks []Hook
}
{{ with extend $ "Builder" $builder }}
{{ template "setter" . }}
{{ end }}
// Save creates the {{ $.Name }} in the database.
func ({{ $receiver }} *{{ $builder }}) Save(ctx context.Context) (*{{ $.Name }}, error) {
{{- $mutation := print $receiver ".mutation" }}
{{- $fields := $.Fields }}{{ if $.ID.UserDefined }}{{ $fields = append $fields $.ID }}{{ end }}
{{- range $f := $fields }}
{{- if or $f.Default (and (not $f.Optional) (ne $f $.ID)) }}
if _, ok := {{ $mutation }}.{{ $f.MutationGet }}(); !ok {
{{- if $f.Default }}
v := {{ $.Package }}.{{ $f.DefaultName }}{{ if or $f.IsTime $f.IsUUID }}(){{ end }}
{{ $mutation }}.Set{{ $f.StructField }}(v)
{{- else }}
return nil, errors.New("{{ $pkg }}: missing required field \"{{ $f.Name }}\"")
{{- end }}
}
{{- end }}
{{- with or $f.Validators $f.IsEnum }}
if v, ok := {{ $mutation }}.{{ $f.MutationGet }}(); ok {
if err := {{ $.Package }}.{{ $f.Validator }}(v); err != nil {
return nil, fmt.Errorf("{{ $pkg }}: validator failed for field \"{{ $f.Name }}\": %v", err)
}
}
{{- end }}
{{- end }}
{{- range $e := $.Edges }}
{{- if not $e.Optional }}
{{- if $e.Unique }}
if _, ok := {{ $mutation }}.{{ $e.StructField }}ID(); !ok {
{{- else }}
if len({{ $mutation }}.{{ $e.StructField }}IDs()) == 0 {
{{- end }}
return nil, errors.New("{{ $pkg }}: missing required edge \"{{ $e.Name }}\"")
}
{{- end }}
{{- end }}
var (
err error
node *{{ $.Name }}
)
if len({{ $receiver }}.hooks) == 0 {
node, err = {{ $receiver }}.{{ $.Storage }}Save(ctx)
} else {
var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {
mutation, ok := m.(*{{ $.MutationName }})
if !ok {
return nil, fmt.Errorf("unexpected mutation type %T", m)
}
{{ $mutation }} = mutation
node, err = {{ $receiver }}.{{ $.Storage }}Save(ctx)
return node, err
})
for i := len({{ $receiver }}.hooks) - 1; i >= 0; i-- {
mut = {{ $receiver }}.hooks[i](mut)
}
if _, err := mut.Mutate(ctx, {{ $mutation }}); err != nil {
return nil, err
}
}
return node, err
}
// 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
}
{{ with extend $ "Builder" $builder }}
{{ $tmpl := printf "dialect/%s/create" $.Storage }}
{{ xtemplate $tmpl . }}
{{ end }}
{{ end }}