entc/gen: move mutation hooks logic to a shared generic function (#3180)

This commit is contained in:
Ariel Mashraki
2022-12-19 17:36:29 +02:00
committed by GitHub
parent 4e662b9e51
commit 34bd0b7b6f
443 changed files with 3082 additions and 19327 deletions

View File

@@ -42,10 +42,6 @@ type {{ $builder }} struct {
// Save creates the {{ $.Name }} in the database.
func ({{ $receiver }} *{{ $builder }}) Save(ctx context.Context) (*{{ $.Name }}, error) {
var (
err error
node *{{ $.Name }}
)
{{- if $.HasDefault }}
{{- if $runtimeRequired }}
if err := {{ $receiver }}.defaults(); err != nil {
@@ -55,47 +51,7 @@ func ({{ $receiver }} *{{ $builder }}) Save(ctx context.Context) (*{{ $.Name }},
{{ $receiver }}.defaults()
{{- end }}
{{- end }}
if len({{ $receiver }}.hooks) == 0 {
if err = {{ $receiver }}.check(); err != nil {
return nil, err
}
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)
}
if err = {{ $receiver }}.check(); err != nil {
return nil, err
}
{{ $mutation }} = mutation
if node, err = {{ $receiver }}.{{ $.Storage }}Save(ctx) ; err != nil {
return nil, err
}
{{- if $.HasOneFieldID }}
mutation.{{ $.ID.BuilderField }} = &node.{{ $.ID.StructField }}
mutation.done = true
{{- end }}
return node, err
})
for i := len({{ $receiver }}.hooks) - 1; i >= 0; i-- {
if {{ $receiver }}.hooks[i] == nil {
return nil, fmt.Errorf("{{ $pkg }}: uninitialized hook (forgotten import {{ $pkg }}/runtime?)")
}
mut = {{ $receiver }}.hooks[i](mut)
}
v, err := mut.Mutate(ctx, {{ $mutation }})
if err != nil {
return nil, err
}
nv, ok := v.(*{{ $.Name }})
if !ok {
return nil, fmt.Errorf("unexpected node type %T returned from {{ $.MutationName }}", v)
}
node = nv
}
return node, err
return withHooks[*{{ $.Name }}, {{ $.MutationName }}](ctx, {{ $receiver }}.{{ $.Storage }}Save, {{ $mutation }}, {{ $receiver }}.hooks)
}
// SaveX calls Save and panics if Save returns an error.

View File

@@ -35,41 +35,8 @@ func ({{ $receiver }} *{{ $builder }}) Where(ps ...predicate.{{ $.Name }}) *{{ $
}
// Exec executes the deletion query and returns how many vertices were deleted.
func ({{ $receiver}} *{{ $builder }}) Exec(ctx context.Context) (int, error) {
var (
err error
affected int
)
if len({{ $receiver }}.hooks) == 0 {
affected, err = {{ $receiver }}.{{ $.Storage }}Exec(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
affected, err = {{ $receiver }}.{{ $.Storage }}Exec(ctx)
mutation.done = true
return affected, err
})
for i := len({{ $receiver }}.hooks) - 1; i >= 0; i-- {
if {{ $receiver }}.hooks[i] == nil {
return 0, fmt.Errorf("{{ $pkg }}: uninitialized hook (forgotten import {{ $pkg }}/runtime?)")
}
mut = {{ $receiver }}.hooks[i](mut)
}
n, err := mut.Mutate(ctx, {{ $mutation }})
if err != nil {
return 0, err
}
nv, ok := n.(int)
if !ok {
return 0, fmt.Errorf("unexpected type %T returned from mutation. expected type: int", n)
}
affected = nv
}
return affected, err
func ({{ $receiver }} *{{ $builder }}) Exec(ctx context.Context) (int, error) {
return withHooks[int, {{ $.MutationName }}](ctx, {{ $receiver }}.{{ $.Storage }}Exec, {{ $mutation }}, {{ $receiver }}.hooks)
}
// ExecX is like Exec, but panics if an error occurs.

View File

@@ -46,10 +46,6 @@ func ({{ $receiver}} *{{ $builder }}) Where(ps ...predicate.{{ $.Name }}) *{{ $b
// Save executes the query and returns the number of nodes affected by the update operation.
func ({{ $receiver }} *{{ $builder }}) Save(ctx context.Context) (int, error) {
var (
err error
affected int
)
{{- if $.HasUpdateDefault }}
{{- if $runtimeRequired }}
if err := {{ $receiver }}.defaults(); err != nil {
@@ -59,40 +55,7 @@ func ({{ $receiver }} *{{ $builder }}) Save(ctx context.Context) (int, error) {
{{ $receiver }}.defaults()
{{- end }}
{{- end }}
if len({{ $receiver }}.hooks) == 0 {
{{- if $.HasUpdateCheckers }}
if err = {{ $receiver }}.check(); err != nil {
return 0, err
}
{{- end }}
affected, 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)
}
{{- if $.HasUpdateCheckers }}
if err = {{ $receiver }}.check(); err != nil {
return 0, err
}
{{- end }}
{{ $mutation }} = mutation
affected, err = {{ $receiver }}.{{ $.Storage }}Save(ctx)
mutation.done = true
return affected, err
})
for i := len({{ $receiver }}.hooks) - 1; i >= 0; i-- {
if {{ $receiver }}.hooks[i] == nil {
return 0, fmt.Errorf("{{ $pkg }}: uninitialized hook (forgotten import {{ $pkg }}/runtime?)")
}
mut = {{ $receiver }}.hooks[i](mut)
}
if _, err := mut.Mutate(ctx, {{ $mutation }}); err != nil {
return 0, err
}
}
return affected, err
return withHooks[int, {{ $.MutationName }}](ctx, {{ $receiver }}.{{ $.Storage }}Save, {{ $mutation }}, {{ $receiver }}.hooks)
}
// SaveX is like Save, but panics if an error occurs.
@@ -155,10 +118,6 @@ func ({{ $receiver }} *{{ $onebuilder }}) Select(field string, fields ...string)
// Save executes the query and returns the updated {{ $.Name }} entity.
func ({{ $receiver }} *{{ $onebuilder }} ) Save(ctx context.Context) (*{{ $.Name }}, error) {
var (
err error
node *{{ $.Name }}
)
{{- if $.HasUpdateDefault }}
{{- if $runtimeRequired }}
if err := {{ $receiver }}.defaults(); err != nil {
@@ -168,46 +127,7 @@ func ({{ $receiver }} *{{ $onebuilder }} ) Save(ctx context.Context) (*{{ $.Name
{{ $receiver }}.defaults()
{{- end }}
{{- end }}
if len({{ $receiver }}.hooks) == 0 {
{{- if $.HasUpdateCheckers }}
if err = {{ $receiver }}.check(); err != nil {
return nil, err
}
{{- end }}
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)
}
{{- if $.HasUpdateCheckers }}
if err = {{ $receiver }}.check(); err != nil {
return nil, err
}
{{- end }}
{{ $mutation }} = mutation
node, err = {{ $receiver }}.{{ $.Storage }}Save(ctx)
mutation.done = true
return node, err
})
for i := len({{ $receiver }}.hooks) - 1; i >= 0; i-- {
if {{ $receiver }}.hooks[i] == nil {
return nil, fmt.Errorf("{{ $pkg }}: uninitialized hook (forgotten import {{ $pkg }}/runtime?)")
}
mut = {{ $receiver }}.hooks[i](mut)
}
v, err := mut.Mutate(ctx, {{ $mutation }})
if err != nil {
return nil, err
}
nv, ok := v.(*{{ $.Name }})
if !ok {
return nil, fmt.Errorf("unexpected node type %T returned from {{ $.MutationName }}", v)
}
node = nv
}
return node, err
return withHooks[*{{ $.Name }}, {{ $.MutationName }}](ctx, {{ $receiver }}.{{ $.Storage }}Save, {{ $mutation }}, {{ $receiver }}.hooks)
}
// SaveX is like Save, but panics if an error occurs.