mirror of
https://github.com/ent/ent.git
synced 2026-05-28 09:49:08 +03:00
entc/gen: move mutation hooks logic to a shared generic function (#3180)
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user