mirror of
https://github.com/ent/ent.git
synced 2026-05-24 09:31:56 +03:00
Reviewed By: alexsn Differential Revision: D16890453 fbshipit-source-id: 362ae9e9666c523bdcce16503441565b6279ff08
92 lines
2.8 KiB
Cheetah
92 lines
2.8 KiB
Cheetah
{{ 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.HasDefault (not $f.Optional) -}}
|
|
if {{ $receiver }}.{{ $f.StructField }} == nil {
|
|
{{ if $f.HasDefault -}}
|
|
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 $f.Validators -}}
|
|
{{/* add nullable check only for optional fields without default value */ -}}
|
|
{{ $nullable := and $f.Optional (not $f.HasDefault) -}}
|
|
{{- 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 }}
|